【问题标题】:List of un-installed apps query returning list of installed apps form PackageManager未安装应用程序列表查询从 PackageManager 返回已安装应用程序列表
【发布时间】:2014-10-21 12:54:47
【问题描述】:

我正在尝试使用 Pacakge 管理器从设备中获取已卸载应用程序的列表。 但是,代码会返回所有已安装应用程序的列表。

// get a list of all installed apps
        List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);



        for(ApplicationInfo unisntalledPackage : packages){


            // itearte hough apps vi acativity manager and get details

            PackageInfo pkginfo=null;
            try {
                pkginfo = pm.getPackageInfo(unisntalledPackage.processName,
                        PackageManager.GET_UNINSTALLED_PACKAGES);
            } catch (NameNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            if (pkginfo !=null && !isSystemPackage(pkginfo)) {

            try{ .....//get info form package object

任何意见表示赞赏。

【问题讨论】:

    标签: android package-managers


    【解决方案1】:

    使用 GET_UNINSTALLED_PACKAGES 会返回“有关具有数据目录的所有应用程序(甚至已卸载的应用程序)的信息。”因此,代码完全符合预期 - 您将获得所有已安装的软件包,以及此外任何已卸载但用户选择保留数据的软件包。

    要仅获取已卸载的软件包,您必须遍历您拥有的列表,仅选择已卸载的软件包。

    【讨论】:

    • 如果我要遍历包含已安装和已卸载的列表,是否可以从已安装的包中标记/区分已卸载的包?
    • 是的 - 查看 ApplicationInfo 中的 FLAG_IS_DATA_ONLY
    • 那么我如何确定标志是否存在?该标志返回一个整数,因此不能使用布尔值来查看 applicationInfo 对象上是否存在
    • 您可以使用 if ((info.flags & ApplicationInfo.FLAG_IS_DATA_ONLY) > 0) { // 采取行动 } 之类的方法检查标志是否已设置。其中 info 是保存您正在检查的 ApplicationInfo 实例的变量。
    【解决方案2】:

    @Zmarties 感谢您的意见。

    通过迭代包 List 并使用 TRUE FLAG_IS_DATA_ONLY 捕获 ApplicationInfo 对象,该对象没有返回 16777216 的整数(如果为 true,则返回该常量)我们可以捕获已卸载的应用程序;

    if(unisntalledPackage.FLAG_IS_DATA_ONLY !=16777216 ){
    
    // then app is unisntalled 
    

    但无法确定没有捕获任何已卸载的应用程序,而我的测试设备上仍有数据。

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2011-06-04
      • 2015-09-17
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多