Вот дополнительный ответ @Josef Pfleger's, для комментария
«Я обнаружил, что на некоторых устройствах нет функции getPackageSizeInfo (), а затем вы получите это исключение java.lang.NoSuchMethodException: getPackageSizeInfo ()» @ ATom 29 ноября 2011 г. в 15: 56.
После API 16 (Build.VERSION.SDK_INT> 16) метод
PackageManager.getPackageSizeInfo(String packageName, IPackageStatsObserver observer);
изменено на:
PackageManager.getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer);
И объяснение нового добавленного параметра userHandle
таково: пользователь, для которого необходимо получить информацию о размере.
Итак, мы должны сделать это так:
int sysVersion= Build.VERSION.SDK_INT;
if (pkgName != null) {// packageName
PackageManager pm = getPackageManager();
try {
Class<?> clz = pm.getClass();
if (sysVersion>16) {
Method myUserId=UserHandle.class.getDeclaredMethod("myUserId");//ignore check this when u set ur min SDK < 17
int userID = (Integer) myUserId.invoke(pm);
Method getPackageSizeInfo = clz.getDeclaredMethod(
"getPackageSizeInfo", String.class,int.class,
IPackageStatsObserver.class);//remember add int.class into the params
getPackageSizeInfo.invoke(pm,pkgName, userID, new PkgSizeObserver());
} else {//for old API
Method getPackageSizeInfo = clz.getDeclaredMethod(
"getPackageSizeInfo", String.class,
IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, pkgName, new PkgSizeObserver());
}
} catch (Exception ex) {
Log.e(TAG, "NoSuchMethodException");
ex.printStackTrace();
throw ex;}
Класс, необходимый для обратного вызова, например:
private class PkgSizeObserver extends IPackageStatsObserver.Stub {
/***
* @param pStatus
* @param succeeded
*/
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
cachesize = pStats.cacheSize;//remember to declare these fields
datasize = pStats.dataSize;
codesize = pStats.codeSize;
totalsize = cachesize + datasize + codesize;
Log.i("123","cachesize--->" + cachesize + " datasize---->"
+ datasize + " codeSize---->" + codesize);
}
}
И используйте этот метод для анализа long2string, тогда вы можете увидеть xx MB
вместо long
, как 2342334:)
private String formateFileSize(long size) {
return Formatter.formatFileSize(MainActivity.this, size);
}