Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取应用程序的大小+;应用程序的数据大小_Java_Android_Size - Fatal编程技术网

Java 如何获取应用程序的大小+;应用程序的数据大小

Java 如何获取应用程序的大小+;应用程序的数据大小,java,android,size,Java,Android,Size,如何获取应用程序的大小,包括AppData的大小 目前我使用这段代码,但它只得到APK大小。有没有办法像谷歌设置应用程序那样获取AppData的大小 public String getApkSize(Context context, String packageName) { try { float value = new File(context.getPackageManager().getApplicationInfo(packageName, 0).publicS

如何获取应用程序的大小,包括AppData的大小

目前我使用这段代码,但它只得到APK大小。有没有办法像谷歌设置应用程序那样获取AppData的大小

public String getApkSize(Context context, String packageName) {
    try {
        float value = new File(context.getPackageManager().getApplicationInfo(packageName, 0).publicSourceDir).length() / 1048576F;

        if (value <= 0) {
            value = 1;
        }

        return String.format("%.2f", value) + "MB";
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}
publicstringgetapksize(上下文,stringpackagename){
试一试{
浮点值=新文件(context.getPackageManager().getApplicationInfo(packageName,0).publicSourceDir).length()/1048576F;

如果(值设置应用程序使用该方法。不幸的是,该方法被隐藏,因为它被
@hide
注释,因此您不能直接使用该方法,但您需要使用反射来调用它

将此权限添加到
AndroidManifest.xml

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
然后你可以这样使用它:

private void getPackageSizeInfo(Context context, String packageName) {
    try {
        PackageManager packageManager = context.getPackageManager();
        Method getPackageSizeInfo = packageManager.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);

        getPackageSizeInfo.invoke(packageManager, packageName, new IPackageStatsObserver.Stub() {
            public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
                long totalCacheSize = packageStats.cacheSize + packageStats.externalCacheSize;
                long totalDataSize = packageStats.dataSize + packageStats.externalDataSize;
                long totalCodeSize = packageStats.codeSize + packageStats.externalCodeSize;
                long totalSize = totalDataSize + totalCodeSize;

                Log.d(TAG, "Total Size:" + totalSize);
                Log.d(TAG, "App Size:" + totalCodeSize);
                Log.d(TAG, "Data Size:" + totalDataSize);
                Log.d(TAG, "Cache Size:" + totalCacheSize);
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

不幸的是,没有官方的方法可以做到这一点。以下内容依赖于反射,因此运行时错误可能就在眼前

PackageManager pm = getPackageManager();

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

getPackageSizeInfo.invoke(pm, "com.android.mms",
    new IPackageStatsObserver.Stub() {

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

            Log.i(TAG, "codeSize: " + pStats.codeSize);
        }
    });

小心,因为这是一个试图实现Android SDK缺失部分的黑客行为。

如果我尝试添加此aidl文件,我会得到以下结果:错误:任务执行失败:app:compiledBugaidl'>java.lang.RuntimeException:com.Android.ide.common.process.ProcessException:org.gradle.process.internal.exeception:process'command'C:\Users\CM\AppData\Local\Android\sdk\build tools\23.0.3\aidl.exe“”已完成非零退出值1其他aidl文件工作正常参考否,您需要使用的隐藏方法是
getPackageSizeInfo
,因此示例是正确的。好的,谢谢。它似乎可以同时使用这两个文件,有什么原因吗?这是和的代码e不是onGetStatsCompleted方法,因此它对您有效真的很奇怪。我可以保证它对我无效。唯一有效的解决方案是示例中的解决方案。
PackageManager pm = getPackageManager();

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

getPackageSizeInfo.invoke(pm, "com.android.mms",
    new IPackageStatsObserver.Stub() {

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

            Log.i(TAG, "codeSize: " + pStats.codeSize);
        }
    });