当前位置: 首页 > news >正文

android开发:zxing-android-embedded竖屏扫描功能

Android 点击按钮调用竖屏二维码扫描

提示:zxing-android-embedded插件已过时,建议更换别的。
场景:Home页面上有个扫描按钮,点击后打开摄像头完成扫描功能,扫描时要求竖屏。
方案:使用zxing-android-embedded插件,新建独立的activity,设置为竖屏。

1. 添加依赖

在 app 的 build.gradle 中添加:

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
}

2. 创建自定义竖屏扫描 Activity

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.journeyapps.barcodescanner.CaptureActivity;

/**
 * 自定义竖屏扫描Activity
 */
public class VerticalScannerActivity extends CaptureActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 可以在这里添加自定义布局或样式
        // 默认情况下会使用库自带的竖屏布局
    }
}

3. 在 AndroidManifest.xml 中声明

<application>
	<!-- 相机权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 自定义扫描Activity -->
    <!-- 强制竖屏 -->
    <activity
        android:name=".VerticalScannerActivity"
        android:screenOrientation="portrait"/>
</application>

4. 创建按钮布局 (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_scan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="扫描二维码"
        android:textSize="18sp"
        android:padding="16dp"/>
</LinearLayout>

5. 实现 MainActivity

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

public class MainActivity extends AppCompatActivity {

    private static final int SCAN_REQUEST_CODE = 1001;
    private TextView tvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnScan = findViewById(R.id.btn_scan);
        tvResult = findViewById(R.id.tv_result);

        btnScan.setOnClickListener(v -> startQrScanner());
    }

    private void startQrScanner() {
        // 创建扫描器实例
        IntentIntegrator integrator = new IntentIntegrator(this);
        // 配置扫描参数
        // integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); // 只扫描QR码
        integrator.setPrompt("将二维码放入框内扫描"); // 提示文字
        integrator.setCameraId(0); // 使用后置摄像头
        integrator.setBeepEnabled(false); // 关闭提示音
        integrator.setBarcodeImageEnabled(false); // 不保存扫描图片
        // integrator.setOrientationLocked(true); // 锁定竖屏
        integrator.setCaptureActivity(VerticalScannerActivity.class); // 使用自定义竖屏Activity
        
        // 启动扫描
        integrator.initiateScan();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        // 处理扫描结果
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {
            if (result.getContents() == null) {
                Toast.makeText(this, "扫描已取消", Toast.LENGTH_SHORT).show();
            } else {
                // 显示扫描结果
                tvResult.setText("扫描结果: " + result.getContents());
            }
        }
    }
}

6. 配置方法

方法 说明
setDesiredBarcodeFormats(String... formats) 设置要扫描的条码类型
setPrompt(String prompt) 设置提示文字
setCameraId(int cameraId) 设置摄像头ID (0=后置, 1=前置)
setBeepEnabled(boolean enabled) 设置扫描成功时是否播放提示音
setBarcodeImageEnabled(boolean enabled) 设置是否保存扫描的条码图片
setOrientationLocked(boolean locked) 是否锁定屏幕方向
setCaptureActivity(Class<?> captureActivity) 设置自定义扫描Activity
setTimeout(long timeout) 设置超时时间(毫秒)
setTorchEnabled(boolean enabled) 是否启用手电筒功能
addExtra(String key, Object value) 添加额外参数

7. 特点说明

  1. 强制竖屏:通过 android:screenOrientation="portrait" 确保扫描界面保持竖屏
  2. 简洁集成:使用 IntentIntegrator 简化扫描流程
  3. 结果处理:在 onActivityResult 中处理扫描结果
  4. 自定义界面:可以通过继承 CaptureActivity 进一步自定义扫描界面
  5. 权限处理:包含完整的运行时权限处理逻辑
http://www.dtcms.com/a/109472.html

相关文章:

  • 四门冷柜、操作台、卧式冰柜区别及运输注意事项
  • 什么是 StarRocks?核心优势与适用场景解析
  • 【深度学习】嘿马深度学习笔记第13篇:卷积神经网络,学习目标【附代码文档】
  • 2025软件供应链安全指南︱构筑企业安全积极防御体系实践
  • U盘实现——BOT 常用命令
  • 无线通信技术(三):5G NR通信频带划分与应用场景
  • Spring Boot后端开发全攻略:核心概念与实战指南
  • python大数据相关职位,还需要学习java哪些知识
  • 股权转让怎么交税?
  • 【动态规划】线性dp——LIS和LCS
  • 网站提示“不安全“怎么办?原因分析与解决方法
  • sqlalchemy详细介绍以及使用方法
  • 防爆对讲机VS非防爆对讲机,如何选择?
  • 将现有 REST API 转换为 MCP Server工具 -higress
  • element-plus中,表单校验的使用
  • HCIP-8 ospf静默接口,ospf树
  • 用Python和Pygame创造粉色粒子爱心:3D渲染的艺术
  • 《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例
  • VTK 各个点颜色的设置
  • 289.将所有数字用字符替换
  • 栈容器的应用
  • 代码随想录|动态规划|17一和零
  • DAY 35 leetcode 202--哈希表.快乐数
  • QT 非空指针 软件奔溃
  • 检索增强生成(RAG) 优化策略
  • LLM架构解析:长短期记忆网络(LSTM)(第三部分)—— 从基础原理到实践应用的深度探索
  • MyBatis:开源、轻量级的数据持久化框架
  • 游戏引擎学习第201天
  • Muduo网络库实现 [九] - EventLoopThread模块
  • 康谋分享 | 仿真驱动、数据自造:巧用合成数据重构智能座舱