Android开发教程二维码扫描功能

news2024/10/23 11:28:53
Android开发教程二维码扫描功能

二维码扫描大一点的app都有的功能,因为扫一下真的很方便

一、思路:

用zxing库

二、效果图:

在这里插入图片描述看视频更加直观点:

Android开发教程实战案例源码分享-二维码扫描功能

三、关键代码:
class FCaptureActivity : AppCompatActivity(), SurfaceHolder.Callback {
    // 相机控制
    private var cameraManager: MyCameraManager? = null
    private var handler: CaptureActivityHandler? = null
    private var viewfinderView: ViewfinderView? = null
    private var hasSurface: Boolean = false
    private var decodeFormats: Collection<BarcodeFormat>? = null
    private val decodeHints: Map<DecodeHintType, *>? = null
    private var characterSet: String? = null
    private var REQUEST_CODE: Int = 1001

    private lateinit var open :CheckBox

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.find_activity_zxing)
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        initUI()

    }

     fun initUI() {

         open = findViewById(R.id.open)

        open.setOnCheckedChangeListener { _, isChecked ->
            when (isChecked) {
                true -> openFlashLight()
                else -> closeFlashLight()
            }
        }
    }




    fun getViewfinderView(): ViewfinderView? {
        return viewfinderView
    }

    fun getHandler(): Handler? {
        return handler
    }

    fun getCameraManager(): MyCameraManager? {
        return cameraManager
    }

    fun drawViewfinder() {
        viewfinderView?.drawViewfinder()
    }

    override fun onResume() {
        super.onResume()
        // CameraManager必须在这里初始化,而不是在onCreate()中。
        // 这是必须的,因为当我们第一次进入时需要显示帮助页,我们并不想打开Camera,测量屏幕大小
        // 当扫描框的尺寸不正确时会出现bug
        cameraManager = MyCameraManager(this)
        viewfinderView = findViewById(R.id.viewfinder_view)
        viewfinderView?.setCameraManager(cameraManager)
        viewfinderView?.setWord(true)
        handler = null
        val surfaceView = findViewById<SurfaceView>(R.id.preview_view)
        val surfaceHolder = surfaceView.holder
        if (hasSurface) {
            // activity在paused时但不会stopped,因此surface仍旧存在;
            // surfaceCreated()不会调用,因此在这里初始化camera
            initCamera(surfaceHolder)
        } else {
            // 重置callback,等待surfaceCreated()来初始化camera
            surfaceHolder.addCallback(this)
        }
        decodeFormats = null
        characterSet = null
    }

    override fun onPause() {
        if (handler != null) {
            handler?.quitSynchronously()
            handler = null
        }
        cameraManager?.closeDriver()
        if (!hasSurface) {
            val surfaceView = findViewById<SurfaceView>(R.id.preview_view)
            val surfaceHolder = surfaceView.holder
            surfaceHolder.removeCallback(this)
        }
        super.onPause()
    }

    /**
     * 初始化Camera
     *
     * @param surfaceHolder
     */
    private fun initCamera(surfaceHolder: SurfaceHolder?) {
        if (surfaceHolder == null) {
            throw IllegalStateException("No SurfaceHolder provided")
        }
        if (cameraManager!!.isOpen) {
            return
        }
        try {
            // 打开Camera硬件设备
            cameraManager?.openDriver(surfaceHolder)
            // 创建一个handler来打开预览,并抛出一个运行时异常
            if (handler == null) {
                handler = CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager)
            }
        } catch (ioe: Exception) {

        }

    }


    /**
     * 扫描成功,处理反馈信息
     *
     * @param rawResult
     * @param barcode
     * @param scaleFactor
     */
    fun handleDecode(result: Result?, barcode: Bitmap?, scaleFactor: Float?) {
        Log.d("handleDecode", "结果${result?.text}")
        Toast.makeText(this,"结果 ${result?.text}",Toast.LENGTH_LONG).show()
//        if (!TextUtils.isEmpty(result?.text)) {
//            if (result?.text!!.indexOf("scan/regID=") != -1) {//扫码登录
//
//            } else if (result?.text!!.indexOf("scan/pcLogin") != -1){ //pc官网登录
//
//            }  else {
//                //基本不会出现这种情况
//                showToastDialog("温馨提示", "无法识别该图片,请用相机扫描", "确认")
//
//            }
//
//        }
    }


    /**
     * 开灯
     */
    private fun openFlashLight() {
        if (!cameraManager!!.isOpen) {
            return
        }
        val parameter = cameraManager?.camera?.parameters
        parameter?.flashMode = FLASH_MODE_TORCH
        cameraManager?.camera?.parameters = parameter
    }

    /**
     * 关闭闪光灯
     */
    private fun closeFlashLight() {
        if (!cameraManager!!.isOpen) {
            return
        }
        val parameter = cameraManager?.camera?.parameters
        parameter?.flashMode = FLASH_MODE_OFF
        cameraManager?.camera?.parameters = parameter
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        if (!hasSurface) {
            hasSurface = true
            initCamera(holder)
        }
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {
        hasSurface = false
    }

}
四、项目demo源码结构图

在这里插入图片描述有问题或者需要完整源码的私信我

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

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

相关文章

音频声音怎么调大?将音频声音调大的几个简单方法

音频声音怎么调大&#xff1f;在现代生活中&#xff0c;音频内容无处不在&#xff0c;从在线课程和播客到音乐和电影&#xff0c;音频已经成为我们获取信息和娱乐的重要方式。然而&#xff0c;许多人在使用音频时可能会遇到一个常见问题&#xff1a;音频声音太小&#xff0c;无…

手机投屏到电脑上的scrcpy软件 scrcpy v2.4

下载&#xff1a;https://drive.uc.cn/s/b1285b1fb9f94?public1 最近的工作需要用到用手机演示一些操作&#xff0c;但是手机屏幕比较小&#xff0c;我就想把手机投到我的电脑上&#xff0c;然后电脑连接投影仪就行了。 scrcpy是一款开源的软件&#xff0c;在githus上可以下…

少儿编程学习,如何走,之点评一二

前言&#xff1a; 不少孩子在少儿机构学习编程的家长跟我反馈&#xff0c;机构学习孩子学了记不住&#xff0c;有些家孩子索性就不去&#xff0c;不愿意再谈编程学习之事。 从一位专业信息学教师出身的老师&#xff0c;稍作点评一二&#xff1a; 【同时也引用了一些主流媒体的…

力扣OJ算法题:合并两个有序链表

—————————————————————————————————————————— 正文开始 OJ算法题&#xff1a;合并两个有序链表 思路 创建一个新的空链表&#xff08;可以用malloc优化&#xff09;和两个指针L1、L2分别指向两个链表&#xff0c;遍历两个链表&am…

python poetry包管理的安装和使用

目录 设置国内(清华)镜像源和升级pip 安装poetry pycharm中使用 常用的poetry命令 本文背景为已经安装好python 设置国内(清华)镜像源和升级pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple python -m pip install --upgrade pip 安装po…

【峟思仪器】高边坡安全监测起到哪些作用

高边坡安全监测起到哪些作用?在当今的工程建设领域&#xff0c;高边坡监测犹如一道坚实的安全防线&#xff0c;其重要性不容小觑。无论是大型水利工程&#xff0c;还是交通基础设施建设&#xff0c;高边坡的稳定性都直接关系到工程的安全和周边环境的安危。高边坡监测在工程建…

在Debian上安装向日葵

说明&#xff1a; 因为之前服务器上安装了 PVE (Proxmox VE)&#xff0c;之前是用 Proxmox VE 进行服务器资源管理的。出于某些原因&#xff0c;现在不再通过 PVE构建的虚拟机来使用计算资源&#xff0c;而是通过 PVE 自带的 Debian 系统直接使用虚拟机资源&#xff08;因为积…

使用Python抓取房源信息

1. 引言 在当今大数据时代&#xff0c;网络爬虫成为获取信息的重要手段之一。本文将以某家二手房为例&#xff0c;演示如何使用Python爬虫抓取房源信息&#xff0c;并将这些信息保存到Excel文件中。 目标网站 2. 准备工作 2.1 安装必要的库 在开始之前&#xff0c;请确保你…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

【在Linux世界中追寻伟大的One Piece】Socket编程UDP

目录 1 -> UDP网络编程 1.1 -> V1版本 -echo server 1.2 -> V2版本 -DictServer 1.3 -> V2版本 -DictServer(封装版) 1 -> UDP网络编程 1.1 -> V1版本 -echo server 简单的回显服务器和客户端代码。 备注&#xff1a;代码中会用到地址转换函数。 noc…

Java面试题库——多线程

1.并行和并发有什么区别&#xff1f; 并行&#xff1a;是指两个或多个事件在同一时刻发生&#xff0c;是在不同实体上的多个事件&#xff1b; 并发&#xff1a;是指两个或多个事件在同一时间间隔发生&#xff0c;是同一实体上的多个事件。2.线程和进程的区别&#xff1f; 根本…

数据结构修炼——常见的排序算法:插入/希尔/选择/堆排/冒泡/快排/归并/计数

目录 一、常见的排序算法二、常见排序算法的实现2.1 排序算法回顾2.1.1 冒泡排序2.1.2 堆排序 2.2 直接插入排序2.3 希尔排序2.4 选择排序2.5 快速排序2.5.1 快速排序&#xff08;霍尔法&#xff09;2.5.2 快速排序&#xff08;挖坑法&#xff09;2.5.3 快速排序&#xff08;前…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏&#xff0c;包含多个选项&#xff0c;如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品&#xff0c;每个产品都有一个图片和简短的描述。页面下…

【Linux】冯诺依曼体系结构 OS的概念

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前言废话&#xff1a…

动态链接过程分析

目录 一、前言二、示例程序三、动态库的加载过程1、动态链接器加载动态库2、动态库的加载地址 四、符号重定位1、全局符号表2、全局偏移表 GOT3、liba.so 动态库文件的布局4、liba.so 动态库的虚拟地址5、GOT 表的内部结构6、反汇编 liba.so 代码 五、补充1、延迟绑定 plt 上文…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

Linux环境配置(学生适用)

1.挑选最便宜的云服务器 如腾讯云服务器&#xff0c;华为云服务器&#xff0c;百度云服务器等等…… 2.找到你的云服务器实例&#xff0c;然后找到你的公网IP。 3.云服务器实例 ---更多 --- 重置root密码 (一定要重置&#xff09; 4. 下载并安装 xshell 或者其他登陆软件 xshel…

12. 命令行

Hyperf 的命令行默认由 hyperf/command 组件提供&#xff0c;而该组件本身也是基于 symfony/console 的抽象。 一、安装 通常来说该组件会默认存在&#xff0c;但如果您希望用于非 Hyperf 项目&#xff0c;也可通过下面的命令依赖 hyperf/command 组件。 composer require hype…

告别ELK,APO提供基于ClickHouse开箱即用的高效日志方案——APO 0.6.0发布

ELK一直是日志领域的主流产品&#xff0c;但是ElasticSearch的成本很高&#xff0c;查询效果随着数据量的增加越来越慢。业界已经有很多公司&#xff0c;比如滴滴、B站、Uber、Cloudflare都已经使用ClickHose作为ElasticSearch的替代品&#xff0c;都取得了不错的效果&#xff…