1 Manifest文件中申请相应的权限
需要注意的是Android 6.0及以上系统需要动态申请权限,不做申请权限处理可能读取不了本地相册的二维码也生成不了二维码。
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2 导入三方库
compile ‘cn.yipianfengye.android:zxing-library:2.1’
3 在Application中或者相应的Activity初始化
ZXingLibrary.initDisplayOpinion(this);
4 具体使用说明
关于二维码主要有以下操作
1 普通扫描并获取二维码的信息
2 从本地相册中选取图片扫描获取二维码的信息
3 生成含有二维码的图片
页面布局如下
4.1 开始扫描
startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class),RESULT_OK);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_OK) {
if (null != data) {
Bundle bundle = data.getExtras();
if (bundle == null) {
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
textView.setText(result);
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
textView.setText("解析失败!");
}
}
}
}
4.2 从图库中选择
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
同样是在onActivityResult方法中获取回调
if (requestCode == REQUEST_IMAGE) {
if (data != null) {
Uri uri = data.getData();
ContentResolver cr = getContentResolver();
try {
Bitmap mBitmap = MediaStore.Images.Media.getBitmap(cr, uri);//显得到bitmap图片
CodeUtils.analyzeBitmap(getPath(mBitmap), new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();
}
@Override
public void onAnalyzeFailed() {
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
});
if (mBitmap != null) {
mBitmap.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意这时候在6.0以上系统中需要动态申请权限,不然的话无法成功返回
//获取Bitmap的文件地址
public String getPath(Bitmap bm) throws IOException {
String path = Environment.getExternalStorageDirectory()+"/quickCode/";
File dirFile = new File(path);
File file = new File(path+"h.png");
if(!dirFile.exists()){
dirFile.mkdirs();
}
if(!file.exists()){
file.createNewFile();
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
return path+"h.png";
}
4.3 生成图片
生成一个带logo的二维码
String textContent = "我是梁超杰";
Bitmap mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
imageView.setImageBitmap(mBitmap);
生成一个不带logo的二维码
String textContent = "我是梁超杰";
Bitmap mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), null));
imageView.setImageBitmap(mBitmap);
5 文章结尾附上本demo的github地址
如果对二维码还需要进行特殊处理,学习一些骚操作可以看看以下两篇博客