Android 10 获取不到已安装应用列表

引言

在开发Android应用时,我们经常需要获取设备上已安装的应用列表。然而,在Android 10系统中,由于安全性和隐私保护的考虑,应用程序无法直接访问设备上已安装的应用列表。本文将介绍Android 10获取不到已安装应用列表的问题,并提供一种解决方法。

问题描述

在Android 10及更高版本中,应用程序使用传统的方法来获取已安装应用列表将会失败。以往我们可以使用PackageManager类的getInstalledPackages()方法来获取已安装应用的信息,但在Android 10中,这个方法将只返回当前应用的信息,而不是设备上所有已安装应用的信息。

PackageManager packageManager = getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);

解决方案

Android 10引入了一种新的权限模型,称为分区存储。分区存储将应用的文件和数据隔离到各自的存储空间中,使得应用程序无法直接访问其他应用的文件和数据。因此,无法通过直接访问设备上的应用列表来获取已安装应用的信息。

然而,Android 10提供了一种新的方法来获取已安装应用列表,即使用PackageVisibility API。PackageVisibility API允许应用程序查询其他应用程序的可见性状态。通过使用PackageVisibility API,我们可以判断设备上已安装应用的可见性状态,从而获取已安装应用的列表。

PackageManager packageManager = getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);

for (PackageInfo packageInfo : installedPackages) {
    try {
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageInfo.packageName, 0);
        boolean isVisible = packageManager.isPackageVisible(packageInfo.packageName);
        if (isVisible) {
            // 应用可见,可以访问应用信息
            String appName = packageManager.getApplicationLabel(applicationInfo).toString();
            String packageName = applicationInfo.packageName;
            Drawable icon = packageManager.getApplicationIcon(applicationInfo);
            // 处理应用信息...
        } else {
            // 应用不可见,无法访问应用信息
            // 处理应用不可见的情况...
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}

上述代码使用PackageVisibility API来判断每个已安装应用的可见性状态。通过isPackageVisible()方法,我们可以判断应用是否可见。如果应用可见,我们可以通过PackageManager获取应用的其他信息,如应用名称、包名和图标。如果应用不可见,我们可以根据需要进行相应的处理。

序列图

以下是获取已安装应用列表的流程的序列图表示。

sequenceDiagram
    participant A as 应用程序
    participant PM as  PackageManager
    participant PV as PackageVisibility
    A ->> PM: 获取已安装应用列表
    PM -->> A: 已安装应用列表
    A ->> PM: 查询应用的可见性状态
    PM -->> PV: 查询应用的可见性状态
    PV -->> PM: 应用的可见性状态
    PM -->> A: 应用的可见性状态
    A ->> PM: 获取应用的其他信息
    PM -->> A: 应用的其他信息

关系图

以下是获取已安装应用列表的相关实体和关系的关系图表示。

erDiagram
    ENTITY PackageManager {
        PackageManagerId INT
        getInstalledPackages()
        getApplicationInfo()
        getApplicationLabel()
        getApplicationIcon()
    }
    ENTITY PackageInfo {
        PackageInfoId INT
        packageName STRING
    }
    ENTITY ApplicationInfo {
        ApplicationInfoId INT
        packageName STRING
    }
    ENTITY Drawable {
        iconId INT
    }
    PackageManagerId ||--o{ PackageInfoId : "has"
    PackageInfoId ||--o{ ApplicationInfoId : "has"
    ApplicationInfoId ||--o{ Drawable : "has"

结论

在Android 10系统中,应用程序无法直接访问设备上已安装的应用列表。然而,我们可以使用PackageVisibility API来获取已安装应用的可见性状态,并进一步获取应用