Android PackageStats始终为零

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

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

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

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

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

对于api <26,

您需要使用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 } }); 

这是完整的解决方案 。 它很棒。

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

但是要使用此代码,您需要使用USCESS ACERMISSION