(Original) method for obtaining the application and cache size after android4.2 (the source code has changed) and android4.2 source code
Used to obtain the application size
PackageManager mPackageManager = getPackageManager ();
try {Method getPackageSizeInfoMethod = PackageManager.class.getDeclaredMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class); getPackageSizeInfoMethod.invoke(mPackageManager, packageInfo.packageName,new MyObserver()); } catch (Exception e) { }
class MyObserver extends IPackageStatsObserver.Stub { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { long cacheSize = pStats.cacheSize; String packageName = pStats.packageName; String formatFileSize = Formatter.formatFileSize( getApplicationContext(), cacheSize); System.out.println(packageName + ":" + formatFileSize); } }
However, PackageManager. getPackageSizeInfo (String packageName, IPackageStatsObserver observer) is unavailable after 4.2,
Change PackageManager. getPackageSizeInfo (String packageName, int userHandle, IPackageStatsObserver observer ),
The added parameter userHandle is interpreted as: The user whose size information shocould be retrieved.
How does this userHandle come from? Obtain it through UserHandle. myUserId () of the system class;
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId"); int userID = (Integer) myUserId.invoke(mPackageManager,null);
After obtaining the information, you can use the new getPackageSizeInfo function.
getPackageSizeInfoMethod.invoke(mPackageManager,packageInfo.packageName, userID, new MyObserver() );