您的位置:首页 > 其它

关于zxing二维码扫描的总结

2017-03-05 00:09 99 查看
众所周知,google的开源zxing二维码扫面,实现了我们基本的项目需求,然而里面还有很多问题需要解决,github上有许多大牛对zxing进行了封装,这边参考了“一片枫叶”的zxing项目。talk is cheap ,show me the code!

1.主activity实现下面几种功能

//普通扫描
mScanBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
//扫描图片解析
mScanImgBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMG);
}
});
//自定义UI
mScanCustomUI.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CustomCaptureActivity.class);
startActivityForResult(intent, REQUEST_CUSTOM);

}
});
//生成图片二维码
mMakeQRImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, MakeQRCodeImgActivity.class);
startActivity(intent);
}
});


2.onActivityResult处理返回内容

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);
Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
}
}
if (requestCode == REQUEST_IMG) {
if (null != data) {
Uri uri = data.getData();
ContentResolver cr = getContentResolver();
try {
Bitmap mBitmap = MediaStore.Images.Media.getBitmap(cr, uri);//显得到bitmap图片
CodeUtils.analyzeBitmap(ImageUtils.getImageAbsolutePath(this, uri), 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();
}
}
}
if (requestCode == REQUEST_CUSTOM) {
//处理扫描结果(在界面上显示)
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);
Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
}
}
}


3.难点:自定义二维码界面

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customcapture);
cancelBtn= (Button) findViewById(R.id.ac_btn_cancel);

CaptureFragment captureFragment = new CaptureFragment();
// 为二维码扫描界面设置定制化界面R_layout.my_camera
CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
/**
* 二维码解析回调函数
*/
CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
bundle.putString(CodeUtils.RESULT_STRING, result);
resultIntent.putExtras(bundle);
setResult(RESULT_OK, resultIntent);
finish();
}

@Override
public void onAnalyzeFailed() {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
bundle.putString(CodeUtils.RESULT_STRING, "");
resultIntent.putExtras(bundle);
setResult(RESULT_OK, resultIntent);
finish();
}
};
captureFragment.setAnalyzeCallback(analyzeCallback);
/**
* 替换我们的扫描控件
*/
getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();


问题一:通过uri得到string类型的根路径,该方法在一片枫叶的文档中是错误的,根本无法转换,通过搜索资料查询到需要自己重写一个工具类进行转换ImageUtils.getImageAbsolutePath(this, uri)。

问题二:在打开闪光灯的时候,一片枫叶的文档上Camera camera = CameraManager.get().getCamera();Android6.0根本无法获得相机,最后改方法为Camera camera= Camera.open();

最后:感谢一片枫叶的demo https://github.com/yipianfengye/android-zxingLibrary

该项目已同步到我的github:https://github.com/zziafyc/QRcodeDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: