二维码扫描的话,现在一般zxing用的比较多,还有一个zbar,已经停止维护了。老早的时候,用的eclipse开发,需要导入jar包,还得把zxing的很多java类拷进项目里,实在有碍观瞻啊。现在ide切换到studio了,感觉方便了很多,jar包不用手动管理了。现在我们用到二维码相关的开发的话,在项目里,可以直接在gradle中引入了。
二维码的开发呢,大致分2种需求吧,一种呢,就是简单的用到扫码生成码的功能;另一种呢,是需要深度定制的,例如扫码界面,近距离扫码精度等。对于第一种,我们希望可以快速集成,那么有没有这样一种框架呢?答案当然是有的,这里介绍2个github项目。
一、zxing-android-embedded
github链接:https://github.com/journeyapps/zxing-android-embedded
这个是基于zxing做的一个封装,具体用法如下:
1.直接调用作者的CaptureActivity
首先在gradle中添加依赖
compile 'com.google.zxing:core:3.2.1'
compile 'com.journeyapps:zxing-android-embedded:3.3.0'
具体使用
new IntentIntegrator(this).initiateScan(); // `this` 当前activity
//或者
IntentIntegrator.forFragment(this).initiateScan(); // `this` 当前fragment
// 获取扫描结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if(result.getContents() == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
一些选择项
new IntentIntegrator(this)
.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
.setPrompt("请对准二维码")// 设置提示语
.setCameraId(0)// 选择摄像头,可使用前置或者后置
.setBeepEnabled(false)// 是否开启声音,扫完码之后会"哔"的一声
.setBarcodeImageEnabled(true)// 扫完码之后生成二维码的图片
.initiateScan();// 初始化扫码
注意,以上扫码是横屏,若要改为竖屏,则在AndroidManifest.xml中配置CaptureActivity
调用时
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setOrientationLocked(false);
integrator.initiateScan();
2.自定义CaptureActivity,可定制扫描界面
参考:https://blog.csdn.net/u010618194/article/details/77891313
Activity中代码如下
public class ScanActivity extends AppCompatActivity {
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
barcodeScannerView = (DecoratedBarcodeView) findViewById(R.id.dbv_custom);
capture = new CaptureManager(this, barcodeScannerView);
capture.initializeFromIntent(getIntent(), savedInstanceState);
capture.decode();
}
@Override
protected void onResume() {
super.onResume();
capture.onResume();
}
@Override
protected void onPause() {
super.onPause();
capture.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
capture.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
capture.onSaveInstanceState(outState);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
capture.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
对应的activity_scan.xml
可以把扫码初始化代码放在Util中
public class ScanUtil {
/**
* 扫码界面
*/
public static void scan(Activity activity){
new IntentIntegrator(activity)
//.setCaptureActivity(ScanActivity.class)
.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
.setPrompt("请对准二维码")// 设置提示语
.setCameraId(0)// 选择摄像头,可使用前置或者后置
.setBeepEnabled(false)// 是否开启声音,扫完码之后会"哔"的一声
.setBarcodeImageEnabled(true)// 扫完码之后生成二维码的图片
.setOrientationLocked(false)
.initiateScan();// 初始化扫码
}
}
二维码的生成
/**
* 二维码制作
*/
public static Bitmap encodeAsBitmap(String str){
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
Log.v("容错率:",ErrorCorrectionLevel.L+"");
Bitmap bitmap = null;
BitMatrix result = null;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 600, 600,hints);
// 使用 ZXing Android Embedded 要写的代码
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.createBitmap(result);
} catch (WriterException e){
e.printStackTrace();
} catch (IllegalArgumentException iae){ // ?
return null;
}
return bitmap;
}
二、BGAQRCode-Android
github链接:https://github.com/bingoogolapple/BGAQRCode-Android
参考:https://blog.csdn.net/fanxudonggreat/article/details/76595587
1.引包
compile 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1'
2.ScanActivity
public class ScanActivity extends AppCompatActivity implements QRCodeView.Delegate{
private QRCodeView qRCodeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
qRCodeView = (QRCodeView)findViewById(R.id.zxingview);
qRCodeView.setDelegate(this);
}
@Override
public void onScanQRCodeSuccess(String result) {
Toast.makeText(ScanActivity.this,result,Toast.LENGTH_SHORT).show();
}
@Override
public void onScanQRCodeOpenCameraError() {
}
@Override
protected void onStart() {
super.onStart();
qRCodeView.startSpotAndShowRect();
}
@Override
protected void onStop() {
qRCodeView.stopCamera();
super.onStop();
}
@Override
protected void onDestroy() {
qRCodeView.onDestroy();
super.onDestroy();
}
}
3.布局文件 activity_scan.xml
二维码的生成
private void createEnglishQRCode() {
/*
这里为了偷懒,就没有处理匿名 AsyncTask 内部类导致 Activity 泄漏的问题
请开发在使用时自行处理匿名内部类导致Activity内存泄漏的问题,处理方式可参考 https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%80%BB%E7%BB%93.md
*/
new AsyncTask() {
@Override
protected Bitmap doInBackground(Void... params) {
return QRCodeEncoder.syncEncodeQRCode("bingoogolapple", BGAQRCodeUtil.dp2px(TestGeneratectivity.this, 150), Color.parseColor("#ff0000"));
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
mEnglishIv.setImageBitmap(bitmap);
} else {
Toast.makeText(TestGeneratectivity.this, "生成英文二维码失败", Toast.LENGTH_SHORT).show();
}
}
}.execute();
}