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更安全且解耦性更强。
修改步骤:
- 注册ActivityResultLauncher
在Activity中定义一个ActivityResultLauncher<Intent>实例,通过registerForActivityResult()方法注册结果回调,把原来onActivityResult()里的逻辑移到回调中。 - 替换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
相关产品推荐
相关产品推荐

