Android API 31及以上版本跨App启动失败问题求助
Android 12/13(API31+)跨应用启动Activity适配方案
问题根源与修复步骤
1. 修正调用端Intent代码
你的Intent同时混合了显式启动(指定ComponentName)和隐式启动参数(ACTION_SEND、CATEGORY、setType),这会导致Intent与目标Activity的Manifest声明不匹配,直接触发ActivityNotFoundException。
简化Intent,移除多余的隐式参数:
Intent intent = new Intent(); // 仅保留显式组件指定 intent.setComponent(new ComponentName("com.company.Appname", "com.company.Appname.presentation.ui.activities.LoginActivity")); intent.putExtra(Intent.EXTRA_TEXT, ssoDetails); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { startActivity(intent); } catch (Exception e) { e.printStackTrace(); intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("playstore url")); try { startActivity(intent); } catch (Exception e1) { e1.printStackTrace(); } }
2. 确认目标应用的Manifest配置
目标应用的LoginActivity必须满足两个核心条件:
- Activity的全类名与你代码中
ComponentName的路径完全一致(注意包名、类名大小写,避免混淆导致类名变更) - 显式设置
android:exported="true"(Android 12+中,无intent-filter的Activity默认exported为false,显式启动必须开启该属性)
目标应用Manifest示例配置:
<activity android:name="com.company.Appname.presentation.ui.activities.LoginActivity" android:exported="true"> <!-- 若该Activity有intent-filter可保留,但显式启动不受其影响 --> </activity>
3. 调用端Manifest的包名声明(Android 11+要求)
即使你尝试过<queries>配置,再次确认调用端Manifest中已正确声明目标应用包名:
<manifest ...> <queries> <!-- 声明要启动的目标应用包名 --> <package android:name="com.company.Appname" /> </queries> <!-- 其他原有配置 --> </manifest>
额外排查点
- 确认测试设备上已安装目标应用,且包名、Activity类名无拼写错误
- 若目标应用为Android 12+版本,检查是否开启了应用隐私限制(禁止其他应用启动该Activity)
- 临时移除异常捕获逻辑,直接启动Intent,查看更详细的系统错误日志
内容的提问来源于stack exchange,提问作者A.R.Patil
相关产品推荐
相关产品推荐

