PackageManager.getInstalledPackages() 的 ActivityInfo[] 为空
ActivityInfo[] is null for PackageManager.getInstalledPackages()
尝试检索每个包的所有活动导致所有活动的 ActivityInfo 数组为空:
List<PackageInfo> packageInfos = mPackageManager.getInstalledPackages(
PackageManager.GET_ACTIVITIES &
PackageManager.GET_SERVICES &
PackageManager.GET_RECEIVERS &
PackageManager.GET_PROVIDERS &
PackageManager.GET_PERMISSIONS);
for (PackageInfo p : packageInfos)
Log.wtf(TAG, p.packageName + ": " + (p.activities == null ? "null" :"not null"));
所有包的 p.activities 为空。根据 https://developer.android.com/reference/android/content/pm/PackageInfo.html#activities 它不应该为空,因为 GET_ACTIVITIES 标志已设置。
那么问题出在哪里呢?
糟糕,我搞砸了按位运算符。必须使用 OR 运算符 (|
) 而不是 AND 运算符 (&
),如下所示:
List<PackageInfo> packageInfos = mPackageManager.getInstalledPackages(
PackageManager.GET_ACTIVITIES |
PackageManager.GET_SERVICES |
PackageManager.GET_RECEIVERS |
PackageManager.GET_PROVIDERS |
PackageManager.GET_PERMISSIONS);
但是,此调用会导致 TransactionTooLargeException
,因为 Android 中不同进程之间的数据大小限制发生了变化,因此大多数返回的 packageInfos
列表可能为 null 或空
尝试检索每个包的所有活动导致所有活动的 ActivityInfo 数组为空:
List<PackageInfo> packageInfos = mPackageManager.getInstalledPackages(
PackageManager.GET_ACTIVITIES &
PackageManager.GET_SERVICES &
PackageManager.GET_RECEIVERS &
PackageManager.GET_PROVIDERS &
PackageManager.GET_PERMISSIONS);
for (PackageInfo p : packageInfos)
Log.wtf(TAG, p.packageName + ": " + (p.activities == null ? "null" :"not null"));
所有包的 p.activities 为空。根据 https://developer.android.com/reference/android/content/pm/PackageInfo.html#activities 它不应该为空,因为 GET_ACTIVITIES 标志已设置。
那么问题出在哪里呢?
糟糕,我搞砸了按位运算符。必须使用 OR 运算符 (|
) 而不是 AND 运算符 (&
),如下所示:
List<PackageInfo> packageInfos = mPackageManager.getInstalledPackages(
PackageManager.GET_ACTIVITIES |
PackageManager.GET_SERVICES |
PackageManager.GET_RECEIVERS |
PackageManager.GET_PROVIDERS |
PackageManager.GET_PERMISSIONS);
但是,此调用会导致 TransactionTooLargeException
,因为 Android 中不同进程之间的数据大小限制发生了变化,因此大多数返回的 packageInfos
列表可能为 null 或空