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

sha*_*ani 6 android android-permissions android-6.0-marshmallow

代码:

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

}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Com*_*are 6

到Android 6.0之前,CLEAR_APP_CACHE有一个protectionLeveldangerous,所以普通SDK的应用程序可以在清单提出要求.

由于Android 6.0,CLEAR_APP_CACHE拥有protectionLevelsignature|privileged.普通的Android应用无法拥有此权限.如果您的应用程序使用固件的签名密钥签名或者您已安装在特权系统分区上,则只能保留此权限.


Dre*_*rez 5

从 Android M -> CLEAR_APP_CACHE,保护级别:系统|签名

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

因此不可能在运行时请求该权限。更准确地说

签名|系统权限,意味着它只能由使用固件的签名密钥签名或安装在系统分区上的应用程序持有(例如,由 root 设备用户持有)。从这个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"/>
Run Code Online (Sandbox Code Playgroud)

为请求代码设置常量。

常量.java

public static final int REQUEST_CODE_FOR_PERMISSION = 501;
Run Code Online (Sandbox Code Playgroud)

请求许可:-

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重写 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 除了这个特定权限是错误的。另外,您无需通过“&lt;permission&gt;”自行声明系统权限。 (3认同)