万年之前就想写篇文章记录一下二维码功能的实现,没想到一拖就到了现在,对了今天是周六 ~~~
现在网上有很多的关于扫码的三方库,当然这些都是基于zxing这个框架去扩展的,我这这里记录俩种方式,一种满足与基本需求,另外一种满足一些扩展性的需求,使用起来比使用zxing方便一些,毕竟进行了二次封装。
俩种方式 :
1.zxing - 可满足基本需求(效果比较渣,用不了的话就放弃)
2.android-zxingLibrary - 可满足自我的一些扩展性需求
方式一 : zxing
Effect
预先配置
1.先在 build.gradle(Project:XXXX) 的 repositories 添加:
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
2.然后在 build.gradle(Module:app) 的 dependencies 添加:
compile 'com.github.yuzhiqiang1993:zxing:2.1.6'
- 权限
1.常规权限加入
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.针对6.0的动态权限申请
Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE
- 扫码方式
1.ZxingConfig配置(看情况使用,如果只是满足基本功能,没必要理会)
//ZxingConfig config = new ZxingConfig();
//config.setShowbottomLayout(true);//底部布局(包括闪光灯和相册)
//config.setPlayBeep(true);//是否播放提示音
//config.setShake(true);//是否震动
//config.setShowAlbum(true);//是否显示相册
//config.setShowFlashLight(true);//是否显示闪光灯
2.触发扫描事件
//这里的config是原作者包装的一些属性
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//如果不传 ZxingConfig的话,两行代码就能搞定了
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
// intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);
startActivityForResult(intent, REQUEST_CODE_SCAN);
}
});
2.onActivityResult回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 扫描二维码/条码回传
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
if (data != null) {
String content = data.getStringExtra(Constant.CODED_CONTENT);
mContent.setText("扫描结果为:" + content);
}
}
}
- 生成二维码
触发生成事件
//定义二维码数据
final String data="我爱你,亲爱的姑娘";
mCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (TextUtils.isEmpty(data)) {
Toast.makeText(MainActivity.this, "data不能为空", Toast.LENGTH_SHORT).show();
return;
}
Bitmap bitmap = null;
try {
/**
* contentEtString:字符串内容
* w:图片的宽
* h:图片的高
* logo:不需要logo的话直接传null
* */
Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
//logo设置为null,则二维码中心没有图片,大小可自己设置,至于显示位置,在自己的布局进行设置
bitmap = CodeCreator.createQRCode(data, 400, 400, null);
mIvCreate.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
});
完整Demo代码
- MainActivity
package com.example.yongliu.zxing;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.WriterException;
import com.yzq.zxinglibrary.android.CaptureActivity;
import com.yzq.zxinglibrary.bean.ZxingConfig;
import com.yzq.zxinglibrary.common.Constant;
import com.yzq.zxinglibrary.encode.CodeCreator;
public class MainActivity extends AppCompatActivity {
private int REQUEST_CODE_SCAN = 111;
private TextView mContent;
private TextView mCreate;
private ImageView mIvCreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView mBtn = findViewById(R.id.btn);
mContent = findViewById(R.id.content);
mCreate = findViewById(R.id.create);
mIvCreate = findViewById(R.id.ic_create);
final ZxingConfig config = new ZxingConfig();
config.setShowAlbum(false);
config.setShowFlashLight(false);
config.setShowbottomLayout(false);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//如果不传 ZxingConfig的话,两行代码就能搞定了
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
// intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);
startActivityForResult(intent, REQUEST_CODE_SCAN);
}
});
//定义二维码数据
final String data="我爱你,亲爱的姑娘";
mCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (TextUtils.isEmpty(data)) {
Toast.makeText(MainActivity.this, "data不能为空", Toast.LENGTH_SHORT).show();
return;
}
Bitmap bitmap = null;
try {
/**
* contentEtString:字符串内容
* w:图片的宽
* h:图片的高
* logo:不需要logo的话直接传null
* */
Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
//logo设置为null,则二维码中心没有图片,大小可自己设置,至于显示位置,在自己的布局进行设置
bitmap = CodeCreator.createQRCode(data, 400, 400, null);
mIvCreate.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 扫描二维码/条码回传
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
if (data != null) {
String content = data.getStringExtra(Constant.CODED_CONTENT);
mContent.setText("扫描结果为:" + content);
}
}
}
}
- activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.yongliu.zxing.MainActivity">
<TextView
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="扫描"/>
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
/>
<TextView
android:id="@+id/create"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="生成"/>
<ImageView
android:id="@+id/ic_create"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>