首页 > 其他分享 >Android开发教程二维码扫描功能

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

时间:2024-10-23 09:17:51浏览次数:3  
标签:教程 surfaceHolder private cameraManager 二维码 handler fun Android null

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

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

一、思路:

用zxing库

二、效果图:

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

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="jUFi6BVH-1729240348587" src="https://player.bilibili.com/player.html?aid=738326655"></iframe>

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源码结构图

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

标签:教程,surfaceHolder,private,cameraManager,二维码,handler,fun,Android,null
From: https://blog.csdn.net/u010074743/article/details/143056755

相关文章

  • Thymeleaf模板引擎教程(详细总结)
    Thymeleaf是一个服务器端Java模板引擎,能够处理HTML、XML、CSS、JAVASCRIPT等模板文件。Thymeleaf模板可以直接当作静态原型来使用,它主要目标是为开发者的开发工作流程带来优雅的自然模板,也是Java服务器端HTML5开发的理想选择。1.创建模......
  • Android13冻结进程分析:如何提高设备性能和用户体验
    本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了冻结进程对应用程序线程的影响,并介绍了Android13与An......
  • Vue2 项目实战:打造一个简易倒计时计时器工具 Vue2 实践教程:如何实现一个工作与休息倒
    效果图Vue2倒计时计时器工具教程在本教程中,我们将一步步实现一个Vue2倒计时计时器工具。这个工具允许用户在工作和休息模式之间切换,并设置倒计时时间。倒计时结束时,系统会发出提醒,提示用户切换工作或休息状态。非常适合初学者练习Vue的数据绑定、计算属性和事件处理......
  • R语言机器学习系列教程大纲
    R语言机器学习算法实战系列(一)XGBoost算法+SHAP值(eXtremeGradientBoosting)R语言机器学习算法实战系列(二)SVM算法+重要性得分(SupportVectorMachine)R语言机器学习算法实战系列(三)lightGBM算法+SHAP值(LightGradientBoostingMachine)R语言机器学习算法实战系列(四)随机森林算法......
  • 100+SCI科研绘图系列教程(R和python)
    科研绘图系列:箱线图加百分比点图展示组间差异-CSDN博客科研绘图系列:箱线图加蜜蜂图展示组间数据分布-CSDN博客科研绘图系列:小提琴图和双侧小提琴图展示组间差异-CSDN博客科研绘图系列:组间差异的STAMP图的ggplot2实现-CSDN博客科研绘图系列:组间差异误差棒展示-CSDN博客科研绘......
  • Android 11.0 系统屏幕灭屏时当收到通知时亮屏功能实现
    1.前言在11.0的系统rom定制化开发中,在对于设备灭屏时,收到通知短信功能系统默认是不亮屏的,但是由于产品开发需要要求在收到短信和通知的时候要求亮屏处理,接下来就来实现这个功能2.系统屏幕灭屏时当收到通知短信时亮屏功能实现的核心类frameworks/base/core/java/android/ap......
  • git hooks工具Yorkie 使用教程
    以下是使用Yorkie的详细教程,包括如何在npmpostinstall中自动运行npxyorkie。使用Yorkie的步骤1.安装Yorkie首先,在你的项目中安装Yorkie:npminstall--save-devyorkie2.配置package.json在package.json中添加hooks配置和postinstall脚本。你的package......
  • PbootCMS找回后台密码教程
    访问数据库管理工具使用phpMyAdmin或其他数据库管理工具,登录到你的数据库。找到用户表导航到PbootCMS数据库,找到用户表(通常名为 pboot_users)。修改密码找到管理员用户的记录,通常用户名为 admin。修改 password 字段。你可以使用MD5加密工具生成一个新......
  • 移动开发(四):.NET MAUI中Android应用修改安装图标和启动页面
    今天继续给大家分享.NETMAUI中开发的Android应用如何修改安装图标和启动页面,希望对大家使用Net开发安卓APP提供一些帮助!一、更换APP应用图标这里我们直接编辑项目文件MyFirstMauiApp.csproj来修改APP应用图标官方案例默认的组合图标,其中ForegroundFile表示前景图像(选填),Inclu......
  • C# 串口通信教程
    串口通信(SerialCommunication)是一种用于设备之间数据传输的常见方法,通常用于与外部硬件设备(如传感器、机器人、微控制器)进行通信。在C#中,System.IO.Ports 命名空间提供了与串口设备交互的功能,可以轻松实现串口通信。本教程将引导你如何在C#中实现串口通信,并展示一些常......