C++ port of ZXing for Android
底层使用C++来处理图像及解析二维码,并且加入了OpenCV来解析图像,可以在更远的距离识别出二维码。
在gradle中:
implementation 'me.devilsen:CZXing:0.8.8'
建议加入abiFilters
defaultConfig {
// 其他设置...
ndk {
// 设置支持的so库架构,设置一个可以减小包的大小
abiFilters "armeabi-v7a","arm64-v8a"
}
}
你可以直接使用已经封装好的ScanActivity作为扫码界面
Resources resources = getResources();
List<Integer> scanColors = Arrays.asList(resources.getColor(R.color.scan_side), resources.getColor(R.color.scan_partial), resources.getColor(R.color.scan_middle));
Scanner.with(this)
.setBorderColor(resources.getColor(R.color.box_line)) // 扫码框边框颜色
.setCornerColor(resources.getColor(R.color.corner)) // 扫码框角颜色
.setScanLineColors(scanColors) // 扫描线颜色(这是一个渐变颜色)
.setScanMode(ScanView.SCAN_MODE_TINY) // 扫描区域
.setTitle("My Scan View") // 扫码界面标题
.showAlbum(true) // 显示相册(默认为true)
.setOnClickAlbumDelegate(new ScanActivityDelegate.OnClickAlbumDelegate() {
@Override
public void onClickAlbum(Activity activity) { // 点击右上角的相册按钮
Intent albumIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
activity.startActivityForResult(albumIntent, CODE_SELECT_IMAGE);
}
@Override
public void onSelectData(int requestCode, Intent data) { // 选择图片返回的数据
if (requestCode == CODE_SELECT_IMAGE) {
selectPic(data);
}
}
})
.setOnScanResultDelegate(new ScanActivityDelegate.OnScanDelegate() { // 接管扫码成功的数据
@Override
public void onScanResult(String result) {
Intent intent = new Intent(MainActivity.this, DelegateActivity.class);
intent.putExtra("result", result);
startActivity(intent);
}
})
.start();
或者使用ScanView来自定义你的界面
<me.devilsen.czxing.view.ScanView
android:id="@+id/surface_view_scan"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在自定义的Activity中你需要接管ScanView的生命周期,具体可以参看ScanActivity界面,同时设定setScanListener()
mScanView.setScanListener(new ScanListener() {
@Override
public void onScanSuccess(String result) {
// 扫码成功
}
@Override
public void onOpenCameraError() {
// 打开相机出错
}
});
调用以下代码,可生成二维码的bitmap,Color为可选参数,默认为黑色。
BarcodeWriter writer = new BarcodeWriter();
Bitmap bitmap = writer.write("Hello World", BarCodeUtil.dp2px(this, 200), BarCodeUtil.dp2px(this, 200), Color.RED);