2016-04-29 16 views
4

AppDataのサイズを含めて、アプリケーションのサイズを取得するにはどうすればよいですか?Appのサイズを取得する方法+ Appのデータのサイズ

現時点ではこのコードを使用していますが、APKサイズを取得するだけです。 Google Setting Appのように、AppDataのサイズを取得する方法はありますか?

public String getApkSize(Context context, String packageName) { 
    try { 
     float value = new File(context.getPackageManager().getApplicationInfo(packageName, 0).publicSourceDir).length()/1048576F; 

     if (value <= 0) { 
      value = 1; 
     } 

     return String.format("%.2f", value) + "MB"; 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

答えて

5

設定アプリはgetPackageSizeInfoという方法を使用します。残念ながら、このメソッドは@hideという注釈が付けられているため非表示になっています。このため、メソッドを直接使用することはできませんが、リフレクションを使用して呼び出す必要があります。あなたはこのようにそれを使用することができます

package android.content.pm; 

import android.content.pm.PackageStats; 
/** 
* API for package data change related callbacks from the Package Manager. 
* Some usage scenarios include deletion of cache directory, generate 
* statistics related to code, data, cache usage(TODO) 
* {@hide} 
*/ 
oneway interface IPackageStatsObserver { 

    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded); 
} 

その後:

AndroidManifest.xmlにこの権限を追加します。

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/> 

はAIDLインターフェイスIPackageStatsObserverを作成しますが

private void getPackageSizeInfo(Context context, String packageName) { 
    try { 
     PackageManager packageManager = context.getPackageManager(); 
     Method getPackageSizeInfo = packageManager.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class); 

     getPackageSizeInfo.invoke(packageManager, packageName, new IPackageStatsObserver.Stub() { 
      public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException { 
       long totalCacheSize = packageStats.cacheSize + packageStats.externalCacheSize; 
       long totalDataSize = packageStats.dataSize + packageStats.externalDataSize; 
       long totalCodeSize = packageStats.codeSize + packageStats.externalCodeSize; 
       long totalSize = totalDataSize + totalCodeSize; 

       Log.d(TAG, "Total Size:" + totalSize); 
       Log.d(TAG, "App Size:" + totalCodeSize); 
       Log.d(TAG, "Data Size:" + totalDataSize); 
       Log.d(TAG, "Cache Size:" + totalCacheSize); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

このaidlファイルを追加しようとすると、次のようになります。エラー:タスク ':app:compileDebugAidl'の実行に失敗しました。 > java.lang.RuntimeException:com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:プロセス 'コマンド' C:\ Users \ CM \ AppData \ Local \ Android \ sdk \ build -tools \ 23.0.3 \ aidl.exe ''非ゼロ終了値1で終了その他の補助ファイルは動作します –

+0

okは動作していますhttp://stackoverflow.com/questions/28791461/ipackagestatsobserver-cannot-be-resolved -to-a-type-android –

+1

いいえ、使用する必要がある隠しメソッドは 'getPackageSizeInfo'なので、例は正しいです。 –

0

を残念ながらなしありそうする公式な方法。以下は、リフレクションに依存しているため、ランタイムエラーが隅々まで迫っている可能性があります。

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 SDKの欠落部分を解決しようとしているため、注意してください。

関連する問題