Android 高版本(Android 9.0) packageManager.getPackageArchiveInfo 总是返回null

在Android 9.0及以上版本,直接通过Environment.getExternalStorageDirectory()访问外部存储被废弃,导致无法正确获取Apk的PackageArchiveInfo。官方推荐使用context.getExternalFilesDir(String type)来代替。修正后的代码能正确返回PackageArchiveInfo。

最近自己写插件时,总是发现packageManager.getPackageArchiveInfo 返回为null,但是自己权限都打开,加载路径也是正确的,到底是为什么呢?

packageInfo =packageManager.getPackageArchiveInfo(path,
                    PackageManager.GET_ACTIVITIES );

原来path写法有问题,之前的写法:

Environment.getExternalStorageDirectory()+"/Download/lh.apk"

可是上面的写法在Android9.0 之后就废弃了(为了提高用户隐私,不建议直接访问共享/外部存储设备),并且不再返回可访问的文件。

那怎么写了,官方推荐使用:

context.getExternalFilesDir(String type)

修改之后,返回就正确了。

 

原文转载自:https://blog.youkuaiyun.com/JimTrency/article/details/105510067

<think>好的,我现在需要帮助用户解决在Android Studio中遇到的PackageManager.MATCH_DIRECT_BOOT_AWARE和MATCH_DIRECT_BOOT_UNAWARE代码错误,具体表现为这两个标志位下方有红色下划线。首先,我应该分析可能的原因。 首先,用户提到的这两个标志位是与直接启动模式相关的。根据引用[4],直接启动模式是从Android 7.1(API 25)开始引入的特性。所以,如果用户的项目的编译版本(compileSdkVersion)低于25,那么这两个标志位可能无法识别,导致错误。因此,第一个可能的解决方案是检查并更新项目的编译版本到至少25或更高。 接下来,用户可能没有正确导入相关的PackageManager类。虽然通常这些常量是自动导入的,但有时候可能需要手动检查导入语句是否正确,或者是否存在包名错误。例如,确保导入的是android.content.pm.PackageManager。 另外,Android Studio的缓存问题有时也会导致代码错误提示不准确。这时候,清理项目并重新构建可能解决问题。用户可以通过点击菜单中的File -> Invalidate Caches / Restart来执行这一操作。 还有一种情况是,用户可能在使用这些标志位时没有正确地进行按位或操作。例如,正确的使用方式是将它们用|符号组合,如PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE。如果用户遗漏了|符号,或者使用了错误的运算符,也会导致错误。 此外,需要确认用户的应用是否在清单文件中正确声明了directBootAware属性。根据引用[4],如果应用需要在直接启动模式下运行组件,必须在对应的组件(如Activity、Service)中设置android:directBootAware="true"。否则,即使使用了正确的标志位,也可能出现预期之外的行为。 最后,如果以上步骤都检查过,但问题依旧存在,可能需要检查Android Studio和Gradle插件的版本是否过旧,更新到最新版本可能修复一些兼容性问题。 总结下来,解决步骤可能包括:检查编译版本,确认导入,清理缓存,检查代码语法,更新清单文件,以及更新开发工具。同时,根据引用[2]和[4]中的示例,确保用户正确使用了这两个标志位来查询所有应用,并区分它们的直接启动模式支持情况。</think>### 逐步解决方案 #### 1. 检查Android API级别 问题可能源于项目编译版本低于Android 7.1(API 25),因为`MATCH_DIRECT_BOOT_AWARE`和`MATCH_DIRECT_BOOT_UNAWARE`是API 25及以上引入的[^4]。 - 在`build.gradle`中确认`compileSdkVersion`和`targetSdkVersion`是否≥25: ```groovy android { compileSdkVersion 34 // 建议更新到最新版本 defaultConfig { targetSdkVersion 34 } } ``` #### 2. 验证PackageManager导入 确保正确导入`PackageManager`类: ```java import android.content.pm.PackageManager; ``` #### 3. 清理Android Studio缓存 缓存错误可能导致语法检查异常: - 点击菜单栏 **File > Invalidate Caches / Restart** - 选择 **Invalidate and Restart** #### 4. 检查标志位使用语法 确保按位或操作符`|`正确组合标志位: ```java int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; List<ApplicationInfo> apps = pm.getInstalledApplications(flags); ``` #### 5. 更新AndroidManifest.xml声明 若需支持直接启动模式,需在组件中声明属性: ```xml <activity android:name=".MainActivity" android:directBootAware="true"> <!-- 或通过代码设置 --> </activity> ``` #### 6. 更新Gradle依赖 确保使用最新版Android Gradle插件: ```groovy dependencies { classpath &#39;com.android.tools.build:gradle:8.2.0&#39; } ``` ### 示例代码修正 ```java // 正确组合标志位并查询应用列表 PackageManager pm = getContext().getPackageManager(); int matchFlags = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; List<ApplicationInfo> apps = pm.getInstalledApplications(matchFlags); // 检查应用是否支持直接启动模式 for (ApplicationInfo app : apps) { boolean isDirectBootAware = (app.directBootAware == true); Log.d("AppInfo", "App: " + app.packageName + ", Direct Boot Aware: " + isDirectBootAware); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值