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 。
- Android和PhoneGap – NPObject上的错误调用方法
- 自定义适配器ViewHolder问题
- RecyclerView没有连接适配器; 跳过布局,数据不显示
- Android webview.postUrl(url,Encodingutils.getBytes(postData,“BASE64”))从postdata字符串中删除“+”
- 没有锚点时,不能使用菜单弹出帮助器
- Android:如何使用HttpsURLConnection以编程方式登录网页
- Jmockit:不能模拟net.android.Uri类的toString方法
- BaseAdapter和毕加索问题
- 黑色屏幕之前的Android Splash Screen