Android 11三星S20 Ultra无法识别已安装Telegram应用问题咨询
问题根因
这个问题不属于三星S20 Ultra机型的特有管控限制,是Android 11(API 级别30)引入的包可见性权限变更导致的通用问题:
- Android 10及更低版本中,应用无需额外权限即可自由查询设备上安装的所有应用的包信息,你的原有代码逻辑可正常运行
- Android 11开始系统收紧了该权限,默认仅允许应用查询系统预置应用、与自身有直接交互链路的应用,未在清单中声明查询权限的第三方应用,调用
getPackageInfo会统一抛出NameNotFoundException,导致误判应用未安装
修复方案
1. 优先方案:清单文件声明查询包名
在你的AndroidManifest.xml根节点下增加<queries>标签,指定你需要查询的Telegram包名即可,不需要申请额外权限,也不会影响Google Play上架:
<manifest ...> <queries> <!-- 声明需要查询官方Telegram的包信息 --> <package android:name="org.telegram.messenger" /> <!-- 如有兼容其他Telegram衍生客户端的需求,可追加对应包名,例如Telegram X的org.thunderdog.challegram --> </queries> <!-- 原有其他配置 --> <application .../> </manifest>
2. 可选方案:申请全量包查询权限
如果你有批量查询多个未知包名应用的需求,可以申请QUERY_ALL_PACKAGES敏感权限,但该权限需要向Google Play提交合理的使用场景说明,否则会被驳回上架,非必要不推荐使用:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
3. 代码兼容优化
针对Android 13及以上版本的getPackageInfo方法废弃问题,可以同步优化代码的版本兼容:
private fun isTelegramAvailable(): Boolean { val pm = applicationContext.packageManager return try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { pm.getPackageInfo( "org.telegram.messenger", PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong()) ) } else { @Suppress("DEPRECATION") pm.getPackageInfo("org.telegram.messenger", PackageManager.GET_ACTIVITIES) } true } catch (e: PackageManager.NameNotFoundException) { false } }
三星机型特殊情况排查
如果完成上述配置后仍有少量三星用户反馈问题,可以引导用户排查两个系统设置:
- 检查手机管家中你的应用的权限配置,是否开放了「查询已安装应用列表」的权限
- 确认用户没有将Telegram设置为系统隐藏应用
内容的提问来源于stack exchange,提问作者maksonnie
相关产品推荐
相关产品推荐

