(原)android4.2以後擷取應用程式和緩衝大小的方法(源碼有改變),android4.2源碼
以前擷取應用的大小是用
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); } }
但在4.2後 PackageManager.getPackageSizeInfo(String packageName, IPackageStatsObserver observer)不可用,
改為PackageManager.getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer),
至於增加的參數userHandle的解釋是:The user whose size information should be retrieved。
這個userHandle怎麼來? 通過系統類別的UserHandle.myUserId()擷取;
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId"); int userID = (Integer) myUserId.invoke(mPackageManager,null);
擷取了以後就可以使用新的getPackageSizeInfo函數了。
getPackageSizeInfoMethod.invoke(mPackageManager,packageInfo.packageName, userID, new MyObserver() );