【问题标题】:Get Cache Directory for all installed apps in android获取 android 中所有已安装应用程序的缓存目录
【发布时间】:2017-03-25 06:26:37
【问题描述】:

我想获取 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

【问题讨论】:

标签: android caching memory-management temp


【解决方案1】:

我为此使用了aidl。

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;

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2013-08-29
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多