PackageManager getChangedPackages始终返回NULL

时间:2018-02-16 19:20:12

标签: android

在我的应用中,我需要监控最近添加或更新的软件包,但是因为Oreo这是一项艰巨的任务。

要做到这一点,我有一个每X次运行一次的服务来检测新安装/更新的应用程序。

此服务的主要核心是从PackageManager调用getChangedPackages函数,但是此函数始终返回null,即使我在两次连续调用getChangedPackages之间的时间间隔内从Play商店安装或更新任何应用程序

https://developer.android.com/reference/android/content/pm/PackageManager.html#getChangedPackages(int)

我需要请求任何权限才能调用此函数吗? getChangedPackages有错误吗?

    private void _doProcess()
    {
        try
        {
            PackageManager package_manager = getPackageManager();
            int sequence_number = ApplicationPreferences.getInteger(this, GET_CHANGED_PACKAGES_SEQUENCE_NUMBER_KEY, 0);
            ChangedPackages changed_packages = package_manager.getChangedPackages(sequence_number);
            LogUtilities.show(this, String.format("Retrieve recently apps installs/updates using sequence number %d returns %s", sequence_number, changed_packages == null ? "null" : "a not null object"));
            if (changed_packages == null) changed_packages = package_manager.getChangedPackages(0);
LogUtilities.show(this, String.format("Retrieve recently apps installs/updates using sequence number %d returns %s", sequence_number, changed_packages == null ? "null" : "a not null object"));
            if (changed_packages != null)
            {
                List<String> packages_names = changed_packages.getPackageNames();
                LogUtilities.show(this, String.format("%d recently installed/updated apps", packages_names == null ? 0 : packages_names.size()));
                if (packages_names != null) for (String package_name : packages_names) PackagesUpdatedReceiver.doProcessPackageUpdate(this, new Intent(isNewInstall(package_manager, package_name) ? Intent.ACTION_PACKAGE_ADDED : Intent.ACTION_PACKAGE_REPLACED).setData(Uri.parse(String.format("package:%s", package_name))));
                LogUtilities.show(this, String.format("Storing %s is the sequence number for next iteration", changed_packages.getSequenceNumber()));
                ApplicationPreferences.putInteger(this, GET_CHANGED_PACKAGES_SEQUENCE_NUMBER_KEY, changed_packages.getSequenceNumber());
            }
            else
            {
                LogUtilities.show(this, String.format("Storing %s is the sequence number for next iteration", sequence_number + 1));
                ApplicationPreferences.putInteger(this, GET_CHANGED_PACKAGES_SEQUENCE_NUMBER_KEY, sequence_number + 1);
            }
        }
        catch (Exception e)
        {
            LogUtilities.show(this, e);
        }     
    }

1 个答案:

答案 0 :(得分:0)

最后知道了。您必须创建一个名为sequenceNumber的变量,并在每次查询更改的程序包时对其进行更新。

private static int sequenceNumber = 0;
...
PackageManager pm = getContext().getPackageManager();
ChangedPackages changedPackages = pm.getChangedPackages(sequenceNumber);
if(changedPackages != null)
    sequenceNumber = changedPackages.getSequenceNumber();