简体   繁体   English

获取android中所有已安装应用的缓存目录

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

I want to get exact size of cache directory of android installed apps. 我想获取Android安装的应用程序的缓存目录的确切大小。 I have tried this. 我已经试过了。

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();
         }

Method to to format size is 格式化大小的方法是

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]);
}

But it is always returns 4Kb 但是总是返回4Kb

I used aidl for this purpose. 我为此目的使用了艾德尔。

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();
        }
  }

I have created 3 aidl files which are as follows. 我创建了3个aidl文件,如下所示。

PackageStats.aidl PackageStats.aidl

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

IPackageDataObserver.aidl IPackageDataObserver.aidl

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

PackageStats.aidl PackageStats.aidl

parcelable PackageStats;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM