我正在尝试使用Java获取应用程序的大小。我的代码如下:
PackageStats packageStats = new PackageStats("com.tsepak.supplierchat.debug");
LoggerDebug.d(TAG, String.valueOf(packageStats.externalCodeSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.externalDataSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.externalCacheSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.externalMediaSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.externalObbSize));
LoggerDebug.d(TAG, "External finished");
LoggerDebug.d(TAG, String.valueOf(packageStats.cacheSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.codeSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.dataSize));
LoggerDebug.d(TAG, String.valueOf(packageStats.packageName));
LoggerDebug.d(TAG, String.valueOf(packageStats.describeContents()))
此代码的输出为:
PackageStats{20bc99f7 com.tsepak.supplierchat.debug}
0
0
0
0
0
External finished
0
0
0
0
我在哪里错了?我似乎无法获得包装尺寸。这些行位于片段内的onViewCreated()
方法内。
答案 0 :(得分:0)
不幸的是,目前没有公共API来检索有关应用程序包的大小信息。但是,基于我过去编写的技术,我们可以使用PackageManager的隐藏getPackageSize方法来检索包含缓存,代码和数据大小信息的PackageStats实例。
首先,我们的应用程序需要GET_PACKAGE_SIZE权限:
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
使用ADT,我们可以将相关的AIDL(PackageStats和IPackageStatsObserver)导入到我们的项目中,并让ADT生成存根。生成存根后,我们可以简单地使用反射来调用隐藏的getPackageSize方法,并在存根的onGetStatsCompleted回调方法中检索PackageStats实例:
PackageManager pm = getPackageManager();
Method getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, "com.android.mms", new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
Log.i(TAG, "codeSize: " + pStats.codeSize);
}
});
虽然这是有效的,但是解决一个缺失的Android API显然是个大黑客。超越SDK绝不是一个好主意,特别是对于公共应用程序。
的信息