簡體   English   中英

如何在運行時在Android Marshmallow中獲取CLEAR_APP_CACHE權限?

[英]How to take CLEAR_APP_CACHE permission in Android Marshmallow at runtime?

代碼

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)

在Android 6.0之前, CLEAR_APP_CACHE具有dangerousprotectionLevel CLEAR_APP_CACHE ,因此普通的SDK應用程序可以在清單中請求它。

從Android 6.0開始, CLEAR_APP_CACHE具有signature|privilegedprotectionLevel 普通的Android應用無法擁有此權限。 如果您的應用程序使用固件的簽名密鑰簽名或者您已安裝在特權系統分區上,則只能保留此權限。

從Android M - > CLEAR_APP_CACHE,保護級別:系統|簽名

Android 6.0不會更改正常權限的行為(所有非危險權限,包括正常權限,系統權限和簽名權限)。

因此,無法在運行時請求該權限。 更確切地說

簽名系統權限,意味着它只能由使用固件簽名密鑰簽名或安裝在系統分區上的應用程序(例如,由root用戶設備用戶)保存。 這個計算器Q / A。

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

在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中覆蓋Below方法。

@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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM