【问题标题】:IPackageStatsObserver not triggered on actual deviceIPackageStatsObserver 未在实际设备上触发
【发布时间】:2018-03-14 16:33:50
【问题描述】:

我有使用 IPackageStatsObserver 计算已安装应用程序存储大小、数据大小和缓存大小的方法,但在实际设备上,callback.onSucces() 没有被触发。在模拟器上工作正常,但从未调用过成功。我在清单中也有 GET_PACKAGE_SIZE 权限。

这里是代码

public void requestAppInfo(String packageName, final AsyncDataReceiver<ArrayList<InstalledAppItem>> callback) {

    PackageManager packageManager = getPackageManager();

    try {
        Method getPackageSizeInfo = packageManager.getClass().getMethod(GET_PACKAGE_SIZE_INFO, String.class, IPackageStatsObserver.class);
        getPackageSizeInfo.invoke(packageManager, packageName, new IPackageStatsObserver.Stub() {
            @Override
            public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {

                int appSize = (int) pStats.codeSize / 1048576;
                int dataSize = (int) pStats.dataSize / 1024;
                int cacheSize = (int) pStats.cacheSize / 1024;

                systemData.clear();
                systemData.add(new InstalledAppItem(0, "Internal Storage Used", appSize + " MB"));
                systemData.add(new InstalledAppItem(1, "Data Used", dataSize + " KB"));
                systemData.add(new InstalledAppItem(2, "Cache Used", cacheSize + "KB"));

                //TODO Check Why callback not triggered on board.
                callback.onSuccess(systemData);
            }
        });

    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }

【问题讨论】:

    标签: android android-package-managers


    【解决方案1】:

    请通过此解决方案link

    我计算了所有已安装应用的缓存大小,希望对您有所帮助...

    //这里的packages是所有包的列表

    Method mGetPackageSizeInfoMethod;
    long mCacheSize;
    
    for (ApplicationInfo pkg : packages) {
                        mGetPackageSizeInfoMethod.invoke(getPackageManager(), pkg.packageName,
                                new IPackageStatsObserver.Stub() {
                                    @Override
                                    public void onGetStatsCompleted(PackageStats pStats,
                                                                    boolean succeeded)
                                            throws RemoteException {
                                        synchronized (apps) {
    
                                            mCacheSize += addPackage(apps, pStats, succeeded);
                                        }
                                    }
                                }
                        );
                    }
    
    private long addPackage(List<AppsListItem> apps, PackageStats pStats, boolean succeeded) {
                long cacheSize = 0;
    
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                    cacheSize += pStats.cacheSize;
                }
    
                cacheSize += pStats.externalCacheSize;
    
                if (!succeeded || cacheSize <= 0) {
                    return 0;
                }
    
                return cacheSize;
            }
        }
    

    【讨论】:

    • 感谢 Mohd Saquib,这个解决方案很有用。
    • 再次感谢您的解决方案,我赞成它以供参考。
    【解决方案2】:

    已更新以支持 Android O(API 级别 26)

    在 Android O(API 级别 26)中,您不能将 getPackageSizeInfo 方法与反射结合使用。以下帖子包含一个代码,可以帮助您在 api 级别 26 及以上的两个应用程序中使用:

    https://stackoverflow.com/a/56616172/1939409

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多