【问题标题】:Android PackageStats gives always zeroAndroid PackageStats 总是为零
【发布时间】:2018-04-02 06:01:50
【问题描述】:

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

我想计算以下目录的大小,我该怎么做? 我知道我可以在 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;

【问题讨论】:

    标签: java android android-package-managers android-storage


    【解决方案1】:

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

    它只会创建 packagestats 对象。作为from the source,构造函数会初始化字段,

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

    对于 api

    您需要使用 IPackageStatsObserver.aidl 并且必须通过 reflection 调用 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
            }
        });
    

    这是complete solution。效果很好。

    来自 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

    【讨论】:

    • 感谢您的回答,但我正在寻找没有反思的答案,您不能依赖于生产代码的反思。感谢澄清PackageStats的概念,我相信android文档不适合这个类。
    • 当我试图获取 package size 时,我搜索了很多。我没有得到任何官方解决方案。
    • @JyotiJK 感谢您的代码,但是storageManager 变量在哪里使用以及我们如何获得info.uid?谢谢。
    • @Acuna 抱歉,我刚刚粘贴了我的项目代码。这里 info.uid 是您的应用程序 uid。 getApplicationInfo().uid
    • 是的,USAGE ACCESS PERMISSION 是什么?是android.permission.PACKAGE_USAGE_STATS吗?
    猜你喜欢
    • 2016-12-29
    • 2014-11-15
    • 1970-01-01
    • 2016-11-09
    • 2014-05-09
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多