Android Java中IntentIntegrator类已废弃,求ZXing替代方案
替换废弃的
com.google.zxing.integration.android.IntentIntegrator方案(基于ZXing) 1. 替换依赖
旧的ZXing集成依赖已废弃,改用官方维护的zxing-android-embedded库,在Module级别的build.gradle(或build.gradle.kts)中添加以下依赖:
implementation 'com.journeyapps:zxing-android-embedded:4.3.0' implementation 'com.google.zxing:core:3.4.1'
2. 替换IntentIntegrator代码
旧的IntentIntegrator来自com.google.zxing.integration.android包,现在替换为com.journeyapps.barcodescanner包下的同名类,API逻辑基本兼容,迁移成本极低:
基础扫码初始化(兼容旧写法)
import com.journeyapps.barcodescanner.IntentIntegrator; // 初始化扫码器,写法和旧代码几乎一致 IntentIntegrator integrator = new IntentIntegrator(QrCodeActivity.this); // 可选:配置扫码参数(比如只识别QR码) integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); integrator.setPrompt("请对准二维码扫描"); integrator.setBeepEnabled(true); // 扫码成功提示音 // 启动扫码(推荐换成Activity Result API替代已废弃的startActivityForResult) integrator.initiateScan();
推荐:使用Activity Result API(替代已废弃的startActivityForResult)
Android官方已废弃startActivityForResult,推荐用ActivityResultLauncher处理扫码结果:
步骤1:注册结果回调
import com.journeyapps.barcodescanner.IntentIntegrator; import com.journeyapps.barcodescanner.IntentResult; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; private ActivityResultLauncher<Intent> scanLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_qr_code); // 注册扫码结果回调 scanLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { IntentResult scanResult = IntentIntegrator.parseActivityResult(result.getResultCode(), result.getData()); if (scanResult != null) { if (scanResult.getContents() == null) { // 用户取消扫码 Toast.makeText(this, "扫码已取消", Toast.LENGTH_SHORT).show(); } else { // 获取扫码内容,处理业务逻辑 String qrContent = scanResult.getContents(); // 示例:显示扫码结果 Toast.makeText(this, "扫码结果:" + qrContent, Toast.LENGTH_LONG).show(); } } } }); }
步骤2:启动扫码
// 初始化扫码配置 IntentIntegrator integrator = new IntentIntegrator(this); integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); integrator.setPrompt("请扫描二维码"); integrator.setCameraId(0); // 0=后置摄像头,1=前置 // 创建扫码Intent并启动 Intent scanIntent = integrator.createScanIntent(); scanLauncher.launch(scanIntent);
3. 处理相机权限
Android 6.0及以上版本需要动态申请相机权限,扫码前需确保权限已获取:
检查并申请权限
import android.Manifest; import android.content.pm.PackageManager; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; // 启动扫码前先检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 申请相机权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100); } else { // 权限已获取,启动扫码 Intent scanIntent = integrator.createScanIntent(); scanLauncher.launch(scanIntent); }
处理权限申请结果
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意权限,启动扫码 IntentIntegrator integrator = new IntentIntegrator(this); integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); Intent scanIntent = integrator.createScanIntent(); scanLauncher.launch(scanIntent); } else { Toast.makeText(this, "需要相机权限才能进行扫码", Toast.LENGTH_SHORT).show(); } } }
说明
旧的com.google.zxing.integration.android.IntentIntegrator属于ZXing早期的集成方案,已停止维护。zxing-android-embedded是官方推荐的替代库,支持最新Android版本,兼容旧API的同时,修复了大量适配问题,包括Android 13+的权限逻辑、深色模式适配等。
内容的提问来源于stack exchange,提问作者Daniele Ferreira da Silva
相关产品推荐
相关产品推荐

