2016-10-26 6 views
4

コードAndroid Marshmallowで実行時にCLEAR_APP_CACHE権限を取得するにはどうすればよいですか?

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) 
+0

マシュマロデバイス –

+0

前に働いているコードは、はい、それはこの答えをdownvotedなぜ事前マシュマロ –

答えて

-2

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

オーバーライド。

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

にうまく機能しているのですか?完全な説明が記載されています。 –

+1

この特定のアクセス許可が間違っていることを除いて。加えて、あなたは ''を介して自分自身でシステム許可を宣言しません。 – CommonsWare

4

Android 6.0以前は、CLEAR_APP_CACHE had a protectionLevel of dangerousなので、通常のSDKアプリではマニフェストでリクエストすることができました。

Android 6.0以降、CLEAR_APP_CACHE has a protectionLevel of signature|privileged。通常のAndroidアプリではこの権限を保持できません。あなたのアプリケーションがファームウェアの署名鍵で署名されている場合、または特権システムパーティションにインストールされている場合にのみ、この権限を保持できます。

アンドロイドMから
+0

このアクセス許可の使用方法の例を教えてください –

3

- > CLEAR_APP_CACHE、保護レベル:システム|署名

のAndroid 6.0(すべて 非危険な権限が通常、システム、および署名 権限を含む)は、通常のアクセス権の動作を変更しません。 。

したがって、実行時にその許可を求めることはできません。根ざしたデバイスのユーザーが、それが唯一、ファームウェアの署名鍵で署名されているか、例えば、システムパーティション(上 インストールされている アプリケーションによって保持させることができることを意味し、システム権限|

署名より正確にするために、 )。 thisからstackoverflow Q/A。

ドキュメント: https://source.android.com/devices/tech/config/runtime_perms.html#affected-permissions

関連する問題