Android获取非Play商店应用列表

时间:2017-02-14 12:02:23

标签: android google-play android-package-managers installed-applications

作为一项安全措施,我想获取一些尚未从Play商店安装的应用列表。有没有办法做到这一点?

packageManager包含方法getInstalledApplications,但我不知道要添加哪些标记来获取列表。任何帮助将不胜感激。

编辑:以下是v4_adi答案的代码示例。

public static List<String> getAppsFromUnknownSources(Context context)
{
  List<String> apps = new ArrayList<>();
  PackageManager packageManager = context.getPackageManager();
  List<PackageInfo> packList = packageManager.getInstalledPackages(0);
  for (int i = 0; i < packList.size(); i++)
  {
     PackageInfo packInfo = packList.get(i);
     if (packageManager.getInstallerPackageName(packInfo.packageName) == null)
     {
        apps.add(packInfo.packageName);
     }
  }

  return apps;
}

这是一个良好的开端,但是这也预先安装了Android和三星应用程序。无论如何要从列表中删除它们?我只想要用户安装来自未知来源的应用程序。

2 个答案:

答案 0 :(得分:2)

以下链接可以回答您的问题 PackageManager类提供getInstallerPackageName方法,该方法将告诉您已安装的软件包的名称。侧载应用程序不包含值。

How to know an application is installed from google play or side-load?

答案 1 :(得分:0)

最初我认为检索未通过Google Play商店安装的应用就足够了。后来我发现我还需要过滤掉预安装的系统应用程序。 我在另一篇文章中找到了拼图的最后一部分:Get list of Non System Applications

public static List<String> getAppsFromUnknownSources(Context context)
{
  List<String> apps = new ArrayList<>();
  PackageManager packageManager = context.getPackageManager();
  List<PackageInfo> packList = packageManager.getInstalledPackages(0);
  for (int i = 0; i < packList.size(); i++)
  {
     PackageInfo packInfo = packList.get(i);
     boolean hasEmptyInstallerPackageName = packageManager
           .getInstallerPackageName(packageInfo.packageName) == null;
     boolean isUserInstalledApp = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0;

     if (hasEmptyInstallerPackageName && isUserInstalledApp)
     {
        apps.add(packInfo.packageName);
     }
  }

  return apps;
}