如何以编程方式计算已安装应用程序的所有缓存大小?

巴努沙玛

我只想显示具有缓存大小的所有已安装应用程序名称的列表。缓存大小必须与android设备中显示的本机设置应用程序相同。

我能够列出所有已安装的应用程序pkg名称,但无法计算与本机设置应用程序显示的缓存大小相同(即谈论设置中清除缓存选项的那个地方)。

pkNames = getPackageManager().getInstalledPackages(0);

                    ArrayAdapter<PackageInfo> adapter = new ArrayAdapter<PackageInfo>(this,
                            android.R.layout.simple_list_item_1, pkNames);
                     final PackageManager pm = getPackageManager();
                    for(int i =0;i<pkNames.size();i++)
                    {
                        ApplicationInfo applicationInfo = pm.getApplicationInfo(pkNames.get(i).packageName.toString(), 0);
                        File file = new File(applicationInfo.publicSourceDir);
                        long size = file.length();
                        System.out.println("application name == "+pkNames.get(i).packageName.toString()+"  ,and size of cache is == "+size(this, size));
                    } 

我使用此代码,但是它将给我该应用程序的.apk大小。:(请事先帮助谢谢。

用户名

要直接获取已安装应用程序的缓存大小,您将无法获取。使用PackageManger时,由于无法直接访问抽象的getPackageSizeInfo方法,因此无法直接获取有关已安装软件包大小的详细信息,因此可以使用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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在Django中以编程方式批准所有已安装的应用程序权限

来自分类Dev

如何计算Linux安装+所有应用程序的大小?

来自分类Dev

如何以编程方式安装应用程序

来自分类Dev

如何以编程方式为所有活动设置Android应用程序主题

来自分类Dev

如何以编程方式管理应用缓存?(退出应用程序时清除它)

来自分类Dev

如何以编程方式清除本机应用程序中的API缓存

来自分类Dev

如何以编程方式从已安装的应用中获取方案?

来自分类Dev

如何以简单的方式重新安装所有带有桌面文件的应用程序?

来自分类Dev

如何查找所有已安装的应用程序

来自分类Dev

如何以编程方式更改应用程序的默认主题?

来自分类Dev

如何以编程方式卸载android系统应用程序?

来自分类Dev

如何以编程方式启动Windows Store应用程序?

来自分类Dev

如何以编程方式从应用程序打开呼叫面板

来自分类Dev

如何以编程方式激活“已安装”?

来自分类Dev

如何以编程方式打开带有myapp文件夹的默认“文件”应用程序?

来自分类Dev

如何获得客户端计算机中所有已安装应用程序的列表?

来自分类Dev

如何以编程方式从iOS应用程序打开Apple Watch伴侣应用程序

来自分类Dev

如何以编程方式从Windows 10应用程序启动Camera应用程序?

来自分类Dev

如何以编程方式更改Eclipse应用程序中的应用程序语言?

来自分类Dev

如何以编程方式在应用程序设置中打开应用程序许可窗口

来自分类Dev

Android-如何以编程方式使我的应用程序默认为短信应用程序

来自分类Dev

如何以编程方式从Flutter应用程序中启动应用程序?

来自分类Dev

如何以编程方式更改Eclipse应用程序中的应用程序语言?

来自分类Dev

如何以编程方式安装应用程序而无需打开Play商店(就像Google云端硬盘一样)

来自分类Dev

如何以编程方式删除已启用沙盒的应用程序中应用程序文件夹内的文件

来自分类Dev

以编程方式列出所有默认应用程序

来自分类Dev

如何获得已安装应用程序的大小?

来自分类Dev

如何在Android中以编程方式关闭所有正在运行的应用程序?

来自分类Dev

如何以编程方式检查是否已安装getopts?如果没有,请安装

Related 相关文章

  1. 1

    如何在Django中以编程方式批准所有已安装的应用程序权限

  2. 2

    如何计算Linux安装+所有应用程序的大小?

  3. 3

    如何以编程方式安装应用程序

  4. 4

    如何以编程方式为所有活动设置Android应用程序主题

  5. 5

    如何以编程方式管理应用缓存?(退出应用程序时清除它)

  6. 6

    如何以编程方式清除本机应用程序中的API缓存

  7. 7

    如何以编程方式从已安装的应用中获取方案?

  8. 8

    如何以简单的方式重新安装所有带有桌面文件的应用程序?

  9. 9

    如何查找所有已安装的应用程序

  10. 10

    如何以编程方式更改应用程序的默认主题?

  11. 11

    如何以编程方式卸载android系统应用程序?

  12. 12

    如何以编程方式启动Windows Store应用程序?

  13. 13

    如何以编程方式从应用程序打开呼叫面板

  14. 14

    如何以编程方式激活“已安装”?

  15. 15

    如何以编程方式打开带有myapp文件夹的默认“文件”应用程序?

  16. 16

    如何获得客户端计算机中所有已安装应用程序的列表?

  17. 17

    如何以编程方式从iOS应用程序打开Apple Watch伴侣应用程序

  18. 18

    如何以编程方式从Windows 10应用程序启动Camera应用程序?

  19. 19

    如何以编程方式更改Eclipse应用程序中的应用程序语言?

  20. 20

    如何以编程方式在应用程序设置中打开应用程序许可窗口

  21. 21

    Android-如何以编程方式使我的应用程序默认为短信应用程序

  22. 22

    如何以编程方式从Flutter应用程序中启动应用程序?

  23. 23

    如何以编程方式更改Eclipse应用程序中的应用程序语言?

  24. 24

    如何以编程方式安装应用程序而无需打开Play商店(就像Google云端硬盘一样)

  25. 25

    如何以编程方式删除已启用沙盒的应用程序中应用程序文件夹内的文件

  26. 26

    以编程方式列出所有默认应用程序

  27. 27

    如何获得已安装应用程序的大小?

  28. 28

    如何在Android中以编程方式关闭所有正在运行的应用程序?

  29. 29

    如何以编程方式检查是否已安装getopts?如果没有,请安装

热门标签

归档