Android PackageStats始终为零 [英] Android PackageStats gives always zero

查看:831
本文介绍了Android PackageStats始终为零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to get the size occupied by my application package. Every application has one location in the internal/external storage.

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

I want to calculate the size of the following directory, how can I do that? I know I can use StorageStateManager on and above Oreo (API 26) devices, but how can I achieve this before oreo devices.

应用程序目录: / Android / data / myapplicationpackage

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

I'm trying to use PackageStats but It's giving me always zero. What's the actual way to use this code?

我使用了以下代码,它给了我全部零。

I used the following code and it gives me all zero.

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;


推荐答案


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

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

它只会创建packagestats对象。来自来自,构造函数将初始化字段,

It will only creates the packagestats object. As from the source, the constructor will do initializing the fields,

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

for api< 26,

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

You need to use IPackageStatsObserver.aidl and have to invoke getPackageSizeInfo method by reflection.

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

但要使用此代码,您需要使用权限允许

But to use this code, You need USAGE ACCESS PERMISSION .

这篇关于Android PackageStats始终为零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆