Android实现条形码与二维码扫描
Android实现条形码与二维码扫描
在本次教程中,我们将使用ZXing库让我们的app实现条形码和二维码的扫描。
为什么选择ZXing
要实现条形码和二维码扫描功能,常用的有下面几种方法:
- 使用Google Play Service和Mobile Vision APIs。
- 使用barcodescanner库。
- 使用ZXing库。
我们来仔细分析以上三种方法各自的优缺点。
- 第一种,使用Google Play Service和Mobile Vision APIs。不合适,因为不是所有的用户设备都有安装Google Play Service,特别是在中国。
- 第二种,使用barcodescanner。也不合适,尽管barcodescanner的导入非常简单,识别也很快,但是UI的调整比较困难。特别是当UI非常复杂时,你就需要拉取整个项目的源码然后自己进行定制。
- 现在就只剩下ZXing了。ZXing库由谷歌出品,所以在短期内应该不会停止维护。很多应用,报错barcodescanner,都是基于ZXingk开发的。使用ZXing我们不用担心用户没有安装Google Play Service,而聚焦于开发和处理结果本身。
ZXing是什么
Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法。
设置项目
添加依赖
在你的build.gradle
文件(application级别)中,添加ZXing core
的库。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// 其他的库在这里...
compile 'com.google.zxing:core:3.3.0'
testCompile 'junit:junit:4.12'
}
添加必要的权限
在你的AndroidManifest.xml
文件中,添加下面的代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.github.marktony.espresso">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<application ...
导入必要的类和资源文件
将整个包复制到你的项目中。
注意:上面的包中的代码我做了简化,如果你需要ZXing示例项目此部分的完整的代码,请访问这里,并下载相应的代码。
代码文件导入完成后,我们还需要导入下面的资源文件:
res/layout/activity_scan
- CaptureActivity的布局文件.res/values/zxing_ids.xml
- zxing id的集合.res/raw/beep.ogg
- 当扫描成功后播放的声音文件.res/drawable/...
- 共3个文件: scan_line.png, qr_code_bg.9.png, shadow.png.
开动吧
现在我们从MainActivity
启动CaptureActivity
并期待获取相应的结果:
public class MainActivity extends AppCompatActivity {
public final static int SCANNING_REQUEST_CODE = 1;
private TextView textView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNING_REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SCANNING_REQUEST_CODE:
if (resultCode == RESULT_OK) {
final Bundle bundle = data.getExtras();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
textView.setText(bundle.getString("result"));
}
});
}
break;
default:
break;
}
}
}
我们可以在onActivityResult()
方法中得到相应的结果。
注意: 如果你的app的target api level是23或者更高, 不要 忘记适配运行时权限因为我们的app需要用到相机。
测试
现在我们可以测试app是否成功运行了。访问 qr-code-generator.com生成你想要的二维码,然后进行愉快的测试吧。我们可以期待获得下面的结果:
结论
在这篇教程中,我们使用ZXing库实现了条形码和二维码的扫描。在你自己的app中,你可能需要对扫描的结果进行进一步的处理,例如加载URL或者是从第三方数据源中获取数据等等。
你可以在访问Espresso项目主页下载全部源代码。Espresso是一个基于MVP架构,采用RxJava2, Retrofit2, Realm3.0, ZXing开发的快递查询App。
参考
ZXing - ZXing("Zebra Crossing")项目官方主页。
联系我
如果你对这篇文章或者项目有任何问题,可以通过以下方式联系我:
GitHub: https://github.com/TonnyL
Zhihu: https://www.zhihu.com/people/kirin-momo/
Slack: https://androiddevsslack.slack.com
Weibo: http://weibo.com/u/5313690193
Medium: https://medium.com/@TonnyL
Twitter: https://twitter.com/TonnyLZTL