前言
本文基于gitHub开源项目android-zxingLibrary编写,地址为https://github.com/yipianfengye/android-zxingLibrary
该项目是对zxing的二次封装,简化了使用过程,适合初学。
但是二次封装也带来了一些BUG和性能损失,所以在有空的时候还是要学习一下zxing的使用。
一、使用环境搭建
1、在module的build.gradle文件中找到dependencies
2、为其添加一行内容implementation ‘cn.yipianfengye.android:zxing-library:2.2’
3、同步一下
二、demo界面的搭建
<?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=".QRCode.QRCodeActivity">
<Button
android:id="@+id/scanQRCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="扫描二维码"/>
<Button
android:id="@+id/scanPicQRCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="扫描已有图片中的二维码"/>
<Button
android:id="@+id/createQRCodePic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="生成二维码"/>
<TextView
android:id="@+id/txtInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
由于我也是初学,所以只做了调用摄像头扫二维码、扫描已有图片中的二维码和生成二维码图片这3个。
三、添加权限声明和activity声明
1、在AndroidManifest.xml文件中声明权限
<!--二维码所用权限-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
2、同样在这个文件中声明activity
<activity android:name="com.uuzuche.lib_zxing.activity.CaptureActivity"/>
代码中呈现的是我们引用的开源代码中封装好的用于扫描二维码的activity,并未包含我自己建立的和上面的界面xml配合使用的activity,如果你的androidStudio并未帮你声明你的activity,你需要自己手动声明一下。
四、开工,写代码
public class QRCodeActivity extends AppCompatActivity {
Context mContext;
Intent intent;
final static int REQUEST_CODE = 100;
final static int REQUEST_IMAGE = 101;
@BindView(R.id.scanQRCode)
Button mScanQRCode;
@BindView(R.id.txtInfo)
TextView mTxtInfo;
@BindView(R.id.scanPicQRCode)
Button mScanPicQRCode;
@BindView(R.id.createQRCodePic)
Button mCreateQRCodePic;
@BindView(R.id.img)
ImageView mImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcode);
ButterKnife.bind(this);
init();
}
private void init() {
mContext = getApplicationContext();
ZXingLibrary.initDisplayOpinion(mContext);
}
@OnClick({R.id.scanQRCode, R.id.scanPicQRCode, R.id.createQRCodePic})
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.scanQRCode:
intent = new Intent(mContext, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE);
break;
case R.id.scanPicQRCode:
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
break;
case R.id.createQRCodePic:
createQRCodePic();
break;
}
}
private void createQRCodePic() {
String textContent = "我有一只小毛驴,我从来也不骑";
Bitmap bitmap = CodeUtils.createImage(textContent, 400, 400, null);
mImg.setImageBitmap(bitmap);
BitmapSaver.saveImageToGallery(bitmap, "QRCode");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//处理二维码扫描结果
if (requestCode == REQUEST_CODE) {
//处理扫描结果(在界面上显示)
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);
mTxtInfo.setText("解析结果:" + result);
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
mTxtInfo.setText("解析二维码失败");
}
}
}
//处理图片扫描结果
else 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(uri.getPath(), new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
mTxtInfo.setText("解析结果:" + result);
}
@Override
public void onAnalyzeFailed() {
mTxtInfo.setText("解析二维码失败");
}
});
if (mBitmap != null) {
mBitmap.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
上面的代码中用到了保存图片到本地的功能,这个工具类的代码如下:
public class BitmapSaver {
/**
* 保存图片到图库
* @param bmp Bitmap对象的图片
* @param bitName 图片的文件名
*/
public static void saveImageToGallery(Bitmap bmp,String bitName ) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(),
"111Bitmap");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = bitName + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我在使用这个工具类的时候将图片一律保存到了111Bitmap文件夹下。
五、备注
扫描已有图片二维码功能对图片清晰度的要求非常高(个人推测是二次封装带来的问题),建议先使用“生成二维码”功能,然后扫描这个生成的二维码。
六、运行效果
null
/**
* 皮这一下就很开心
*/