安卓OnClickListener点击后Activity未启动,startActivityForResult废弃求替代方案
问题修复方案
核心原因
你遇到的无响应问题核心是startActivityForResult方法已在AndroidX Activity 1.2.0 & Fragment 1.3.0及以上版本废弃,同时未做意图有效性校验导致启动失败无反馈。
最简替代方案
步骤1:声明Activity Result启动器,替代原有onActivityResult逻辑
在Activity/Fragment成员变量位置添加如下代码:
private ActivityResultLauncher<Intent> googlePayLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Log.d("result", result.getData().getStringExtra("Status")); } } );
步骤2:修改点击事件逻辑,补充意图有效性校验
替换原有点击事件里的启动逻辑,同时增加应用存在性判断,避免无反应情况:
mBoutonPaye.setOnClickListener(new View.OnClickListener( ) { @Override public void onClick(View view) { Uri uri = new Uri.Builder() .scheme("upi") .appendQueryParameter("pa", "test@creditmutuel") .appendQueryParameter("pn", "TacosKing") .appendQueryParameter("mc", "1234") .appendQueryParameter("tr", "123456789") .appendQueryParameter("tn", "test") .appendQueryParameter("am","10.01") .appendQueryParameter("cu", "INR") .appendQueryParameter("url", "https://tes.merchant.website") .build(); Intent intent = new Intent( Intent.ACTION_VIEW ); intent.setData(uri); intent.setPackage(GOOGLE); // 新增校验:判断是否有可响应的应用 if (intent.resolveActivity(getPackageManager()) != null) { // 用launch方法替代废弃的startActivityForResult googlePayLauncher.launch(intent); } else { // 可增加Toast提示用户未安装对应支付应用 Toast.makeText(YourActivity.this, "未安装对应支付应用", Toast.LENGTH_SHORT).show(); } } });
额外注意项
- 需确保项目依赖已引入AndroidX Activity和Fragment的对应版本,若未引入可在模块级build.gradle的dependencies中添加:
implementation 'androidx.activity:activity:1.7.2' implementation 'androidx.fragment:fragment:1.6.1'
- 确认你定义的
GOOGLE常量对应的包名正确,若无需限制仅某应用响应可删除intent.setPackage(GOOGLE)代码,系统会自动弹出所有支持UPI协议的应用选择列表。 - 若你的应用targetSdkVersion >= 30,需要在AndroidManifest.xml根标签下添加如下查询声明,避免应用存在但校验不通过的问题:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="upi" /> </intent> </queries>
内容的提问来源于stack exchange,提问作者Quentin Ramecourt
相关产品推荐
相关产品推荐

