You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

startActivityForResult(android.content.Intent, int)已弃用,Android扫码应用该如何处理?

解决startActivityForResult被弃用的问题:改用Activity Result API

从AndroidX Activity 1.2.0和Fragment 1.3.0开始,startActivityForResult()和onActivityResult()被正式弃用,官方推荐使用Activity Result API来处理活动间的结果传递,这个API更安全且解耦性更强。

修改步骤:

  1. 注册ActivityResultLauncher
    在Activity中定义一个ActivityResultLauncher<Intent>实例,通过registerForActivityResult()方法注册结果回调,把原来onActivityResult()里的逻辑移到回调中。
  2. 替换startActivityForResult调用
    用launcher的launch()方法替代原来的startActivityForResult()。

修改后的完整代码:

package com.example.wfr;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;

public class MainActivity extends AppCompatActivity {
    // 定义ActivityResultLauncher,替代原来的REQUEST_CODE和onActivityResult
    private final ActivityResultLauncher<Intent> qrScanLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                // 处理扫描结果,对应原来onActivityResult里的逻辑
                if (result.getResultCode() == RESULT_OK) {
                    Intent data = result.getData();
                    if (data != null) {
                        String scannedText = data.getStringExtra("com.journeyapps.barcodescanner.CaptureActivity.SCAN_RESULT");
                        TextView scannedTextView = findViewById(R.id.scanned_text);
                        scannedTextView.setText(scannedText);
                    }
                }
            }
    );

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

        // 打开二维码扫描器的按钮点击事件
        findViewById(R.id.camera_button).setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, QRCodeScanner.class);
            intent.putExtra("SCAN_FORMATS", "QR_CODE");
            // 用launcher启动活动,替代startActivityForResult
            qrScanLauncher.launch(intent);
        });
    }

    // 移除原来的onActivityResult方法
}

关键说明:

  • registerForActivityResult()需要在**Activity创建阶段(比如onCreate内)**注册,不能在点击事件等动态时机注册,否则会触发报错。
  • 每个ActivityResultLauncher对应一个特定的结果回调,无需再用REQUEST_CODE区分不同请求,逻辑更清晰。
  • 如果项目未依赖AndroidX Activity/Fragment库,需确保build.gradle中包含以下依赖(版本号可根据实际情况调整):
    implementation 'androidx.activity:activity:1.8.0'
    implementation 'androidx.fragment:fragment:1.6.1'
    

内容的提问来源于stack exchange,提问作者Netbull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:41:16