簡體   English   中英

獲取android中所有已安裝應用的緩存目錄

[英]Get Cache Directory for all installed apps in android

我想獲取Android安裝的應用程序的緩存目錄的確切大小。 我已經試過了。

List<ApplicationInfo> listOfApps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
     for(ApplicationInfo applicationInfo : listOfApps) {

         try {

             Context context = createPackageContext(applicationInfo.packageName,CONTEXT_IGNORE_SECURITY);
             File file = context.getCacheDir();
             if(file!=null){
             String path = file.getAbsolutePath();

             long dir = file.length();
             Log.d("All_Package", applicationInfo.packageName + "\t\t" + MemoryFreedPredication.formatFileSize(String.valueOf(dir)) + " \t\t"+path);}
         } catch (PackageManager.NameNotFoundException e) {
             e.printStackTrace();
         }

格式化大小的方法是

public static String formatFileSize(String fileSize) {

    String[] sizes = {"B", "KB", "MB", "GB"};
    double len = Double.parseDouble(fileSize);
    int order = 0;

    if (len < 1024) {
        return String.format("%s %s", 1, sizes[1]);
    } else {
        while (len >= 1024 && order + 1 < sizes.length) {
            order++;
            len = len / 1024;
        }
    }

    len = Math.round(len * 100.0) / 100.0;
    return String.format("%s %s", len, sizes[order]);
}

但是總是返回4Kb

我為此目的使用了艾德爾。

final PackageManager packageManager = getPackageManager();

    final List<ApplicationInfo> applicationInfos = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);


    for(final ApplicationInfo runningTaskInfo : applicationInfos){

        try {
            Context context = createPackageContext(runningTaskInfo.packageName,CONTEXT_IGNORE_SECURITY);
           // PackageManager packageManager = context.getPackageManager();

            Method getPackageSizeInfo = packageManager.getClass().getMethod(
                    "getPackageSizeInfo", String.class, IPackageStatsObserver.class);

            getPackageSizeInfo.invoke(packageManager, runningTaskInfo.processName,
                    new IPackageStatsObserver.Stub() {

                        @Override
                        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
                                throws RemoteException {

                            //Log.d("App_Size123","\n"+runningTaskInfo.loadLabel(packageManager)+"\t"+formatFileSize(String.valueOf(pStats.codeSize)));
                            Log.d("App_Size123","\n"+runningTaskInfo.loadLabel(packageManager)+"\t"+formatFileSize(String.valueOf(pStats.dataSize)));
                            //Log.d("App_Size123","\n"+runningTaskInfo.loadLabel(packageManager)+"\t"+formatFileSize(String.valueOf(pStats.cacheSize)));
                           //Log.d("App_Size123","\n"+runningTaskInfo.loadLabel(packageManager)+"\t"+formatFileSize(String.valueOf(pStats.externalDataSize)+"\n"));
                        }
                    });

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
  }

我創建了3個aidl文件,如下所示。

PackageStats.aidl

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

IPackageDataObserver.aidl

interface IPackageDataObserver {
void onRemoveCompleted(in String packageName, boolean succeeded);
}

PackageStats.aidl

parcelable PackageStats;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM