Android PackageStats 总是返回零

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;
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) {}

但是要使用这段代码,您需要使用权限许可


谢谢你的回答,但我正在寻找没有反射的答案,生产代码不能依赖于反射。 感谢您澄清了PackageStats的概念,我相信安卓文档对这个类的解释不够清晰。 - sam_k
当我尝试获取包的大小时,我进行了很多搜索。但我没有得到官方的解决方案。 - Jyoti JK
1
@JyotiJK 谢谢你的代码,但是 storageManager 变量在哪里使用,我们如何获取 info.uid?谢谢。 - Acuna
@Acuna 抱歉,我刚刚粘贴了我的项目代码。这里的 info.uid 是您的应用程序 uid。getApplicationInfo().uid - Jyoti JK
而且,什么是“使用访问权限”?它是android.permission.PACKAGE_USAGE_STATS吗? - Acuna
可以参考这个链接 - Jyoti JK

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