Android实现二维码扫描功能(一)ZXing插件接入

news2024/12/25 23:54:27

简介
关于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.CaptureActivity
com.google.zxing.decoding.CaptureActivityHandler
com.google.zxing.decoding.DecodeHandler
com.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...
    <activity 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方法中,可参考注释。

 @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;
    }
}

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

@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);
    }
}
 

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

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

参考资料

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

Github项目地址(保持更新),已基本解决相册选图的适配问题:
https://github.com/ahuyangdong/QrCodeDemo4
————————————————
版权声明:本文为CSDN博主「ahuyangdong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ahuyangdong/article/details/76405557
————————————————
版权声明:本文为CSDN博主「甲骨文18」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_72957457/article/details/126702804

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Molecular Cancer|CDK9抑制诱导表观遗传重编程,揭示了规避淋巴瘤耐药性的策略

细胞周期蛋白依赖性激酶&#xff08;CDK&#xff09;蛋白家族在细胞周期进程&#xff08;如CDK1/2/4/6&#xff09;和RNA转录&#xff08;如CDK7/8/9/11&#xff09;的调控中起着不可或缺的作用。由于染色体区域易位或基因扩增导致的CDKs表达失调与肿瘤发生有关。在淋巴瘤细胞中…

无线通信——Mesh自组网的多跳性

Mesh的多跳性 Mesh网络具备多跳性。什么是多跳性呢&#xff1f;上面说过&#xff0c;每一个具备Mesh网络的设备都是独立的节点。因此&#xff0c;当我发出一条数据时&#xff0c;这些数据会通过跳跃到达不同的网络节点&#xff0c;数据从一个节点跳到另一个节点&#xff0c;直到…

使用烧瓶的简单电子商务API

一、说明 让我们试一试烧瓶&#xff08;Flask&#xff09;这个模型框架&#xff0c;这个应用程序可让您管理和扩展您的云端业务&#xff1b;它允许管理人员浏览和计算商店的总销售额并从在线商店 - 服装。 二、什么是烧瓶&#xff1f; 什么是烧瓶&#xff1f;它是一个Web框架 -…

指数杠杆平台是什么?融资杠杆一般是多少?

指数杠杆平台是近年来兴起的一种金融投资工具&#xff0c;它通过使用杠杆效应&#xff0c;允许投资者以较少的资金投入获得较大的投资回报。指数杠杆平台交易的产品通常是股票指数&#xff0c;例如道琼斯工业平均指数、纳斯达克综合指数等。 在指数杠杆平台交易中&#xff0c;…

ChatGPT:让机器学习与深度学习变得轻松有趣

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 深度学习和机器学习是当…

互联网医院系统:数字时代医疗的未来

随着科技的迅速发展&#xff0c;互联网医院系统已经成为医疗领域的一大创新。这一数字化解决方案不仅为医疗保健提供了更多的便捷性&#xff0c;还在全球范围内推动了医疗服务的变革。本文将探讨互联网医院系统的定义、优势和未来潜力。 什么是互联网医院系统&#xff1f; 互…

5.外部中断

中断初始化配置步骤&#xff1a; IO口初始化配置 开启中断总允许EA 打开某个IO口的中断允许 打开IO口的某一位的中断允许 配置该位的中断触发方式 中断函数&#xff1a; #pragma vector PxINT_VECTOR __interrupt void 函数名(void){}#pragma vector PxINT_VECTOR __int…

PMP和ACP考哪个证书好,还是两个都考?

建议有条件都考&#xff0c;如果只能考一门&#xff0c;建议考PMP&#xff0c;PMP考试中会涉及敏捷管理的内容&#xff0c;特别是今年发布了新考纲&#xff0c;敏捷管理的内容已经增加到了50%。 先讲一下PMP PMP是美国PMI为考察项目管理人士的专业能力而设立的考试&#xff0…

使用Git下载大语言模型

在下载Huggingface和ModelScope上面的大语言预训练模型的时候&#xff0c;经常会因为网页无法访问或者文件太大无法下载的情况&#xff0c;是大家常常比较苦恼的事情&#xff0c;下面给出用Git下载模型到本地的方法&#xff0c;可以轻松解决上述问题。 目录 一、下载和安装Gi…

如何使用Etherscan Remix插件验证智能合约

在Moonbeam上验证合约的方式有很多&#xff0c;使用Etherscan Remix插件是最快、最简单的方式。 此示例中&#xff0c;我们展示如何在Remix上激活Etherscan插件并验证简单的增量智能合约。开始之前&#xff0c;请准备以下内容&#xff1a; MetaMask钱包 存有DEV的账户 将验证…

Linux 基础入门

目录 一、计算机 1、组成 2、功能 二、操作系统 1、定义 2、主要工作 3、操作系统内核功能 4、常见的操作系统 三、Linux的组成 四、搭建Linux学习环境 五、安装远程连接Linux的软件 1、安装xshell 2、安装mobaxterm 六、Linux操作系统学习大纲 一、计算机 1、组…

Multisim14.0仿真(二十三)施密特触发器构成的多谐振荡器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

JVM111

JVM1 字节码与多语言混合编程 字节码 我们平时说的java字节码&#xff0c; 指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器&#xff0c;可以编译出相同的字节码文件&#xff0c;字节码文件…

外卖订餐系统:数字时代的美食点餐新体验

在数字时代&#xff0c;外卖订餐系统已经成为现代生活的一部分。它不仅改变了我们点餐的方式&#xff0c;还为餐饮业带来了巨大的变革。本文将深入探讨外卖订餐系统的崭新世界&#xff0c;探讨它的发展历程、优势和未来趋势。 从电话点餐到外卖订餐系统 许多人还记得过去打电…

LeetCode 1194.锦标赛优胜者

数据准备 Create table If Not Exists Players (player_id int, group_id int); Create table If Not Exists Matches (match_id int, first_player int, second_player int, first_score int, second_score int); Truncate table Players; insert into Players (player_id, g…

python进制转换

""" 基数:有几个数 0b 2进制: 0、1 基数是:2 0o 8进制: 0、1、2、3、4、5、6、7 基数是:8 0d 10进制: 0到9 基数是:10 0x 16进制: 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 基数是:16十进制转二进制: bin() 十进制转八进…

那么国内比较好用的ai写作助手?

在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;已经取得了巨大的进步&#xff0c;其中之一就是AI写作助手。这些工具基于先进的自然语言处理技术&#xff0c;可以生成多种类型的文本&#xff0c;包括文章、博客、广告文案、新闻稿等。它们不仅可以提供高质量的…

canvas绘制基本图形——矩形

我们在初识canvas的时候已经用它画过矩形了&#xff0c;今天我们就总结下矩形的绘画方式 rect rect就是简单最基本的矩形绘制方法。它拥有四个参数&#xff0c;第一二两个参数表示他的x&#xff0c;y坐标&#xff0c;注意这是确定矩形左上角的坐标。第三和第四两个参数则表示…

Vue监控路由/路由参数, 刷新当前页面数据的几种方法

目录 Vue监控路由 Vue中watch监控路由 Vue中watch监控路由的某一个参数 Vue中watch同时监控多个路由 刷新当前页面数据 location.reload $router.go(0) this.$router.resolve()与this.$router.resolve() this.$router.resolve() this.$router.push() 场景 往期相关…

对比接口测试工具在自动化测试优缺点:Jmeter、Python、Postman

一、JMeter 总结&#xff1a;适合对代码不敏感的使用人员&#xff0c;不会代码也可以完成接口自动化&#xff0c;设计框架。适合紧急迭代的项目。 JMeter接口测试的优势 小巧轻量级&#xff0c;并且开源免费&#xff0c;社区接受度高&#xff0c;比较容易入门支持多协议&…