4

我正在尝试获取我的应用程序包占用的大小。每个应用程序在内部/外部存储中都有一个位置。

我想计算以下目录的大小,我该怎么做?我知道我可以在 Oreo (API 26) 设备上及以上使用StorageStateManager,但是如何在 oreo 设备之前实现这一点。

申请目录:/Android/data/myapplicationpackage

我正在尝试使用PackageStats,但它总是给我零。使用此代码的实际方法是什么?

我使用了以下代码,它给了我所有的零。

PackageStats stats = new PackageStats(context.getPackageName());
    long codeSize  = stats.codeSize + stats.externalCodeSize;
    long dataSize  = stats.dataSize + stats.externalDataSize;
    long cacheSize = stats.cacheSize + stats.externalCacheSize;
    long appSize   = codeSize + dataSize + cacheSize;
4

1 回答 1

11

PackageStats stats = new PackageStats(context.getPackageName());

它只会创建 packagestats 对象。从源头开始,构造函数将初始化字段,

 public PackageStats(String pkgName) {
        packageName = pkgName;
        userHandle = UserHandle.myUserId();
    }

对于 api<26,

您需要使用并且必须通过反射IPackageStatsObserver.aidl调用getPackageSizeInfo方法。

PackageManager pm = getPackageManager();

Method getPackageSizeInfo = pm.getClass().getMethod(
    "getPackageSizeInfo", String.class, IPackageStatsObserver.class);

getPackageSizeInfo.invoke(pm, "com.yourpackage",
    new IPackageStatsObserver.Stub() {

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
            throws RemoteException {

            //here the pStats has all the details of the package
        }
    });

这是它的完整解决方案。它工作得很好。

从 api 26 开始

getPackageSizeInfo方法已弃用。

您可以使用此代码,

 @SuppressLint("WrongConstant")
            final StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);
            final StorageManager storageManager = (StorageManager)  context.getSystemService(Context.STORAGE_SERVICE);
            try {
                        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packagename, 0);
                        StorageStats storageStats = storageStatsManager.queryStatsForUid(ai.storageUuid, info.uid);
                        cacheSize =storageStats.getCacheBytes();
                        dataSize =storageStats.getDataBytes();
                        apkSize =storageStats.getAppBytes();
                        size+=info.cacheSize;
                } catch (Exception e) {}

但要使用此代码,您需要USAGE ACCESS PERMISSION

于 2018-04-02T06:18:18.970 回答