如何在Android Marshmallow上运行时获取CLEAR_APP_CACHE权限?

6

代码:

void clearCache() {

    if (mClearCacheObserver == null) {
        mClearCacheObserver = new CachePackageDataObserver();
    }

    PackageManager mPM = getPackageManager();

    @SuppressWarnings("rawtypes")
    final Class[] classes = {Long.TYPE, IPackageDataObserver.class};

    Long localLong = Long.valueOf(CACHE_APP);


    try {
        Method localMethod =
                mPM.getClass().getMethod("freeStorageAndNotify", classes);

        localMethod.setAccessible(true);
        // Start of inner try-catch block

        try {
            localMethod.invoke(mPM, localLong, mClearCacheObserver);

        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.getCause().printStackTrace();
        }

        // End of inner try-catch block

    } catch (NoSuchMethodException e1) {

        e1.printStackTrace();
    }

}

Logcat:

java.lang.SecurityException: Neither user 10206 nor current process has android.permission.CLEAR_APP_CACHE.
     at android.os.Parcel.readException(Parcel.java:1620)
     at android.os.Parcel.readException(Parcel.java:1573)
     at android.content.pm.IPackageManager$Stub$Proxy.freeStorageAndNotify(IPackageManager.java:5081)
     at android.app.ApplicationPackageManager.freeStorageAndNotify(ApplicationPackageManager.java:2500)
     at android.content.pm.PackageManager.freeStorageAndNotify(PackageManager.java:4710)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.onexsoftech.clearcacheapp.MainActivity.clearCache(MainActivity.java:278)
     at com.onexsoftech.clearcacheapp.MainActivity.insertDummyContactWrapper1(MainActivity.java:495)
     at com.onexsoftech.clearcacheapp.MainActivity.insertDummyContact(MainActivity.java:472)

这段代码在 Marshmallow 设备之前的设备上是否有效? - Narender Reddy
是的,在Marshmallow之前它工作得很好。 - shaik subhani
3个回答

8
在Android 6.0之前,CLEAR_APP_CACHEprotectionLeveldangerous,因此普通SDK应用程序可以在清单文件中请求该权限。
从Android 6.0开始,CLEAR_APP_CACHEprotectionLevelsignature|privileged。普通Android应用程序无法拥有此权限。您只能在使用固件签名密钥签署的应用程序上拥有此权限,或者安装在特权系统分区上才能拥有此权限。

1
你能提供一个如何使用这个权限的例子吗? - Mina Fawzy

6

从Android M -> CLEAR_APP_CACHE, 保护级别: system|signature

Android 6.0不改变普通权限(包括普通、系统和签名权限)的行为。

因此,无法在运行时请求该权限。更准确地说,这是一个签名|系统权限,意味着它只能由使用固件签名密钥签名或安装在系统分区上的应用程序持有(例如,由根设备用户)。参考stackoverflow Q/A。

文档:https://source.android.com/devices/tech/config/runtime_perms.html#affected-permissions


-3
在AndroidManifest.xml中添加权限
<permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>

为请求代码创建一个常量。

Constants.java

public static final int REQUEST_CODE_FOR_PERMISSION = 501;

请求权限:

public static void requestPermissionForClearCache(Activity activity) {
    if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.CLEAR_APP_CACHE) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CLEAR_APP_CACHE)) {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CLEAR_APP_CACHE}, Constatnts.REQUEST_CODE_FOR_PERMISSION);
        } else {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CLEAR_APP_CACHE}, Constatnts.REQUEST_CODE_FOR_PERMISSION);
        }
    }
}

在Fragment中重写以下方法。

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == Constatnts.REQUEST_CODE_FOR_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // permission was granted successfully
    } else {
        // permission was NOT granted successfully
    }
}

为什么这个回答被踩了?详细解释如下。 - Prashant M
3
除了这个特定的权限是错误的之外,您不应该通过<permission>声明系统权限。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接