2015-02-09 38 views
3

我只想顯示所有安裝的應用程序名稱與緩存大小的列表。緩存大小必須與android設備中的原生設置應用程序顯示相同。如何以編程方式計算已安裝應用程序的所有緩存大小?

我能列出所有已安裝的應用程序pkg名稱,但無法計算出原生設置應用程序顯示的相同緩存大小(我正在談論設置中清除緩存選項的地方)。

​​

我使用此代碼,但它會給我那個應用程序的.apk大小。 :( 請幫助 在此先感謝。

+0

請檢查答案 – user1140237 2015-02-09 11:44:41

+0

我檢查了但不能理解你的答案 – 2015-02-09 11:47:41

+0

你有沒有試過代碼?作爲它的工作..它正在計算安裝的應用程序的緩存大小... – user1140237 2015-02-09 11:51:37

回答

11

獲取安裝的應用程序的緩存大小直接不能得到的。 作爲使用PackageManger我們不能直接獲得有關安裝包大小爲抽象getPackageSizeInfo方法的細節是directl你不能通過使用Java Reflection來訪問,你可以調用它。如果將來方法名稱更改或任何事情發生變化,它可能無法正常工作。

您需要創建AIDL IPackageStatsObserver .aidl & PackageStats.aidl這應該是在android.content.pm包,你不能直接訪問它們。

IPackageStatsObserver.aidl

package android.content.pm; 
import android.content.pm.PackageStats; 
oneway interface IPackageStatsObserver { 
void onGetStatsCompleted(in android.content.pm.PackageStats pStats, boolean succeeded); 
} 

PackageStats.aidl

package android.content.pm; 
parcelable PackageStats; 

IPackageStatsObserver.aidl & PackageStats.aidl都保持在android.content.pm包。 IDataStatus

public interface IDataStatus { 
    public void onStatusListner(String msg); 
} 

活動

public class MyScreen extends Activity implements OnClickListener { 
    public static final int FETCH_PACKAGE_SIZE_COMPLETED = 100; 
    public static final int ALL_PACAGE_SIZE_COMPLETED = 200; 
    IDataStatus onIDataStatus; 
    TextView lbl_cache_size; 
    ProgressDialog pd; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     findViewById(R.id.btn_get_cacheSize).setOnClickListener(this); 
     lbl_cache_size = (TextView) findViewById(R.id.lbl_cache_size); 
     // clearCache(); 
    } 

    private void showProgress(String message) { 
     pd = new ProgressDialog(this); 
     pd.setIcon(R.drawable.ic_launcher); 
     pd.setTitle("Please Wait..."); 
     pd.setMessage(message); 
     pd.setCancelable(false); 
     pd.show(); 

    } 

    long packageSize = 0, size = 0; 
    AppDetails cAppDetails; 
    public ArrayList<PackageInfoStruct> res; 

    private void getpackageSize() { 
     cAppDetails = new AppDetails(this); 
     res = cAppDetails.getPackages(); 
     if (res == null) 
      return; 
     for (int m = 0; m < res.size(); m++) { 
      PackageManager pm = getPackageManager(); 
      Method getPackageSizeInfo; 
      try { 
       getPackageSizeInfo = pm.getClass().getMethod(
         "getPackageSizeInfo", String.class, 
         IPackageStatsObserver.class); 
       getPackageSizeInfo.invoke(pm, res.get(m).pname, 
         new cachePackState()); 
      } catch (SecurityException e) { 
       e.printStackTrace(); 
      } catch (NoSuchMethodException e) { 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 

     } 
     handle.sendEmptyMessage(ALL_PACAGE_SIZE_COMPLETED); 
     Log.v("Total Cache Size", " " + packageSize); 

    } 

    private Handler handle = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case FETCH_PACKAGE_SIZE_COMPLETED: 
       if (packageSize > 0) 
        size = (packageSize/1024000); 
       lbl_cache_size.setText("Cache Size : " + size + " MB"); 
       break; 
      case ALL_PACAGE_SIZE_COMPLETED: 
       if (null != pd) 
        if (pd.isShowing()) 
         pd.dismiss(); 

       break; 
      default: 
       break; 
      } 

     } 

    }; 

    private class cachePackState extends IPackageStatsObserver.Stub { 

     @Override 
     public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) 
       throws RemoteException { 
      Log.d("Package Size", pStats.packageName + ""); 
      Log.i("Cache Size", pStats.cacheSize + ""); 
      Log.w("Data Size", pStats.dataSize + ""); 
      packageSize = packageSize + pStats.cacheSize; 
      Log.v("Total Cache Size", " " + packageSize); 
      handle.sendEmptyMessage(FETCH_PACKAGE_SIZE_COMPLETED); 
     } 

    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.btn_get_cacheSize: 
      size = 0; 
      packageSize = 0; 
      showProgress("Calculating Cache Size..!!!"); 
      /** 
      * You can also use async task 
      * */ 
      new Thread(new Runnable() { 

       @Override 
       public void run() { 
        getpackageSize(); 
       } 
      }).start(); 

      break; 
     } 
    } 

} 

AppDetails

public class AppDetails { 
    Activity mActivity; 
    public ArrayList<PackageInfoStruct> res = new ArrayList<PackageInfoStruct>(); 
    public ListView list; 
    public String app_labels[]; 

    public AppDetails(Activity mActivity) { 
     this.mActivity = mActivity; 

    } 

    public ArrayList<PackageInfoStruct> getPackages() { 
     ArrayList<PackageInfoStruct> apps = getInstalledApps(false); /* 
                    * false = 
                    * no system 
                    * packages 
                    */ 
     final int max = apps.size(); 
     for (int i = 0; i < max; i++) { 
      apps.get(i); 
     } 
     return apps; 
    } 

    private ArrayList<PackageInfoStruct> getInstalledApps(boolean getSysPackages) { 

     List<PackageInfo> packs = mActivity.getPackageManager() 
       .getInstalledPackages(0); 
     try { 
      app_labels = new String[packs.size()]; 
     } catch (Exception e) { 
      Toast.makeText(mActivity.getApplicationContext(), e.getMessage(), 
        Toast.LENGTH_SHORT).show(); 
     } 
     for (int i = 0; i < packs.size(); i++) { 
      PackageInfo p = packs.get(i); 
      if ((!getSysPackages) && (p.versionName == null)) { 
       continue; 
      } 
      PackageInfoStruct newInfo = new PackageInfoStruct(); 
      newInfo.appname = p.applicationInfo.loadLabel(
        mActivity.getPackageManager()).toString(); 
      newInfo.pname = p.packageName; 
      newInfo.datadir = p.applicationInfo.dataDir; 
      newInfo.versionName = p.versionName; 
      newInfo.versionCode = p.versionCode; 
      newInfo.icon = p.applicationInfo.loadIcon(mActivity 
        .getPackageManager()); 
      res.add(newInfo); 

      app_labels[i] = newInfo.appname; 
     } 
     return res; 
    } 

    class PackageInfoStruct { 
     String appname = ""; 
     String pname = ""; 
     String versionName = ""; 
     int versionCode = 0; 
     Drawable icon; 
     String datadir = ""; 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/btn_get_cacheSize" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Get Cache Size" /> 

    <TextView 
     android:id="@+id/lbl_cache_size" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Cache Size : " /> 

</LinearLayout> 
+0

是的......但我想知道緩存後臺進程的狀態......我怎麼能做到這一點...... – 2015-02-13 13:28:42

+0

其實我想知道應用程序後臺緩存的進程和進程的大小他們用。 – 2015-02-13 15:19:49

+0

IDataStatus是一個aidl文件或一個簡單的界面 – Nepster 2015-03-27 06:17:08

0

找到該應用程序緩存文件夾到內存在以下路徑

「/data/data/com.your.package.appname/cache」

計算在磁盤上的應用程序緩存的大小。

相關問題