最新更新

2019年最新版本:Android实现二维码扫描功能(五)-封装与接入ZXing扫码库 接入与修改更加方便。

简介

关于Android扫描二维码的功能实现,网上有很多相关资料。在对比之后,选用了前辈了修改过的ZXing直接接入到项目中,特制作此demo,介绍整个过程。

(最新更新)本篇文章讲解的接入方法对部分开发者新人来说有点困难,因此做了一个library版本的扫码库,比较方便接入,不想关心细节的可以直接前往Android实现二维码扫描功能(五)-封装与接入ZXing扫码库。

效果预览

先上图展示效果(模拟器没有摄像头,录出来效果不好,将就看)

集成步骤

1、拷贝本项目demo中的com.google.zxing5个包引入到自己的项目中。

2、拷贝本项目demo中的布局activity_scanner.xml和toolbar_scanner.xml

3、拷贝资源目录raw至本项目中,beep.ogg是扫描成功时的提示音。

4、拷贝或合并文件内容attrs.xml/colors.xml/ids.xml三个文件。

5、build.gradle文件中添加引用

compile 'com.google.zxing:core:3.3.0'

6、修改R文件引用路径
修改以下4个文件中的R文件引用地址,引用本项目的R。

com.google.zxing.activity.CaptureActivitycom.google.zxing.decoding.CaptureActivityHandlercom.google.zxing.decoding.DecodeHandlercom.google.zxing.view.ViewfinderView

集成部分到此结束,下面看一下如何实现功能。

权限配置

AndroidManifest.xml中添加权限申请代码:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera.autofocus" /> 

注册CaptureActivity:

<application... android:name="com.google.zxing.activity.CaptureActivity"/>application>

Android6.0之后Camera需要加入动态权限申请代码,在下面的实现部分会给出。

功能实现

完成上述集成之后,通过调用CaptureActivity就可以实现扫码功能。
MainActivity源码部分:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    Button btnQrCode; // 扫码    TextView tvResult; // 结果    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        btnQrCode = (Button) findViewById(R.id.btn_qrcode);        btnQrCode.setOnClickListener(this);        tvResult = (TextView) findViewById(R.id.txt_result);    }    // 开始扫码    private void startQrCode() {        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {                Toast.makeText(MainActivity.this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();            }            // 申请权限            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);            return;        }        // 二维码扫码        Intent intent = new Intent(MainActivity.this, CaptureActivity.class);        startActivityForResult(intent, Constant.REQ_QR_CODE);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_qrcode:                startQrCode();                break;        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        //扫描结果回调        if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) {            Bundle bundle = data.getExtras();            String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);            //将扫描出的信息显示出来            tvResult.setText(scanResult);        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case Constant.REQ_PERM_CAMERA:                // 摄像头权限申请                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    // 获得授权                    startQrCode();                } else {                    // 被禁止授权                    Toast.makeText(MainActivity.this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();                }                break;        }    }}

在发起CaptureActivity前,需要申请动态权限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {   // 申请权限    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);    return;}

申请结果处理在onRequestPermissionsResult方法中,可参考注释。

 @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    switch (requestCode) {        case Constant.REQ_PERM_CAMERA:            // 摄像头权限申请            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                // 获得授权                startQrCode();            } else {                // 被禁止授权                Toast.makeText(MainActivity.this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();            }            break;    }}

获得扫描结果

zxing的CaptureActivity已经完美的实现了扫码和结果回传,我们只需要在调用方处理返回结果就可以了。

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    //扫描结果回调    if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) {        Bundle bundle = data.getExtras();        String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);        //将扫描出的信息显示出来        tvResult.setText(scanResult);    }}

这里使用一个TextView呈现扫码结果。

结语

到这里已经完成了Android扫码功能,并可以通过调用摄像头实时扫码并处理结果,可以在项目中直接使用。感谢相关开源作者的贡献,让我们集成扫码功能如此简单。

参考资料

  • http://www.jianshu.com/p/e80a85b17920

源码下载

将源码上传csdn,有需要的去下载吧。(旧版)
http://download.csdn.net/detail/ahuyangdong/9915661

Github项目地址(保持更新),已基本解决相册选图的适配问题:
https://github.com/ahuyangdong/QrCodeDemo4

更多相关文章

  1. Android读取应用列表权限漏洞
  2. Android(安卓)运行时权限详解
  3. 一个简单的Android破解WIFI密码的方法(实用)
  4. Android仿QQ登录界面示例,实现登录、注册功能。
  5. 融云 Android(安卓)sdk 2.1+ 稳定版 UI 和 模块功能自定义
  6. 优秀的Android计算器
  7. android 系统解耦思想-设置与framework
  8. 第十五期:英语流利说 Android(安卓)架构演进
  9. Android(安卓)7.0,6.0系统相机调用问题解决

随机推荐

  1. Android开关机代码
  2. android studio中rendering problems解决
  3. Android 实现监听开机启动开启后台服务,并
  4. 如何屏蔽自动弹出的输入法软件盘
  5. android 利用startActivityForResult()方
  6. android查看第三方libs的jar源码
  7. android的Home键的监听封装工具类(一)
  8. Android bitmap的压缩方式总结
  9. Android Handler线程间通信机制分析
  10. Android抓屏源码