Android11访问系统短信应用跳转报ActivityNotFoundException如何解决
问题根因
- 第二种写法
ComponentName参数错误:构造函数第二个参数要求传入目标Activity的完整类名,你传入的是应用包名com.google.android.apps.messaging,系统无法找到对应Activity,直接抛出ActivityNotFoundException。 - 第一种写法存在两处错误:一是
getLaunchIntentForPackage返回的Intent本身已经携带正确的启动参数,无需额外配置;二是错误调用addCategory(Intent.ACTION_MAIN),Intent.ACTION_MAIN是Action类型常量,不属于Category范畴,添加后会导致Intent匹配异常。 - 两种写法均未做异常保护:没有对Intent判空或者捕获启动异常,当设备未安装对应应用时会直接崩溃。
- 你在Manifest中添加的
<queries>配置是正确的,符合Android 11+的包可见性要求,无需修改。
修复方案
最优方案(无硬编码,兼容性最高)
直接使用PackageManager获取启动Intent,不要自行构造Component参数,代码如下:
Intent launchMsgIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.google.android.apps.messaging"); if (launchMsgIntent != null) { startActivity(launchMsgIntent); } else { // 自定义未安装应用的兜底逻辑,比如提示用户、跳转系统默认短信应用 Toast.makeText(this, "未找到谷歌短信应用", Toast.LENGTH_SHORT).show(); }
硬编码类名方案(不推荐,仅适配特定版本的谷歌短信应用)
如果确实需要自行构造Component,先通过adb命令获取当前设备上谷歌短信应用的启动Activity全类名:adb shell dumpsys package com.google.android.apps.messaging | grep -A 2 "android.intent.action.MAIN"
将获取到的Activity类名替换到ComponentName的第二个参数,参考代码如下:
// 示例类名仅供参考,不同版本谷歌短信应用的类名可能不同 ComponentName compName = new ComponentName("com.google.android.apps.messaging", "com.google.android.apps.messaging.ui.ConversationListActivity"); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setComponent(compName); try { startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(this, "启动失败,应用版本不兼容", Toast.LENGTH_SHORT).show(); }
内容的提问来源于stack exchange,提问作者shrikrishna
相关产品推荐
相关产品推荐

