Android低API设备调用getInstallSourceInfo崩溃及兼容方案咨询
Android 安装源获取适配方案
问题背景
你的应用中使用以下代码获取安装源:
String market_name = context.getPackageManager().getInstallSourceInfo(context.getPackageName()).getInstallingPackageName();
这段代码在 API 级别低于30的设备上会崩溃,抛出错误:
java.lang.NoSuchMethodError: No virtual method getInstallSourceInfo
应用适配 API 23+,需要解决低版本兼容以及 Android 15 移除getInstallerPackageName()的问题。
适配方案
1. 低版本兼容:用getInstallerPackageName()替代
是的,在 API 30 以下的设备上,必须使用getInstallerPackageName()替代getInstallSourceInfo()。该方法从 API 3 就已存在,完全覆盖你的适配范围(API23+)。
你可以通过 API 版本判断实现兼容:
String marketName; PackageManager pm = context.getPackageManager(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API30+ 使用新方法 try { InstallSourceInfo sourceInfo = pm.getInstallSourceInfo(context.getPackageName()); marketName = sourceInfo.getInstallingPackageName(); } catch (PackageManager.NameNotFoundException e) { // 处理包未找到的异常 marketName = null; } } else { // API30以下 使用旧方法 marketName = pm.getInstallerPackageName(context.getPackageName()); }
2. Android 15 移除getInstallerPackageName()的应对
根据官方规划,getInstallerPackageName()会在 Android 15 被移除,此时需注意:
- 当应用编译目标(targetSdkVersion)升级到 Android 15 及以上时,彻底移除对
getInstallerPackageName()的调用。 - Android 15 及以上设备统一使用
getInstallSourceInfo(),同时处理可能的异常(比如应用通过ADB安装、系统应用等场景,可能无法获取到安装源)。 - 若需兼容 Android 15 以下设备,保留上述API版本判断逻辑即可——低版本系统会自动走旧方法分支,Android 15及以上系统会走新方法分支,不会触发旧方法调用。
另外需注意:getInstallSourceInfo()返回的InstallSourceInfo还提供getInitiatingPackageName()(获取发起安装请求的包名),和getInstallingPackageName()(执行安装的包名)可能存在区别,可根据业务需求选择合适字段。
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

