安卓获取非Play Store应用列表

3
作为一项安全措施,我想获取未从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和Samsung应用程序。有没有办法将它们从列表中删除?我只想要未知来源的用户安装应用程序。


如果问题解决了,请将解决问题的回答标记为已接受。 - v4_adi
2个回答

2

1

最初我认为仅检索未通过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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接