Причина: java.lang.SecurityException: ни у пользователя 10110, ни у текущего процесса нет android.permission.CLEAR_APP_CACHE - PullRequest
0 голосов
/ 07 июня 2018
private static final long CACHE_APP = Long.MAX_VALUE;
private CachePackageDataObserver mClearCacheObserver;
btnCache.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        clearCache();
    }
});//End of btnCache Anonymous class

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

  /*
   * 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.printStackTrace();
  }
  /*
   * End of inner try-catch block
   */
}
catch (NoSuchMethodException e1)
{
  // TODO Auto-generated catch block
  e1.printStackTrace();
}
}//End of clearCache() method

private class CachePackageDataObserver extends IPackageDataObserver.Stub 
{
public void onRemoveCompleted(String packageName, boolean succeeded) 
{

}//End of onRemoveCompleted() method
}//End of CachePackageDataObserver instance inner class



 class CachePackageDataObserver extends IPackageDataObserver.Stub {
    public void onRemoveCompleted(String packageName, boolean succeeded) {

    }//End of onRemoveCompleted() method
}

Я использую разрешение ниже

<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>

Приведенный выше код отлично работает для устройств

1 Ответ

0 голосов
/ 07 июня 2018

Начиная с Android 6.0, уровень разрешений для CLEAR_APP_CACHE равен signature|privileged.Обычные приложения для Android не могут иметь это разрешение.Это разрешение предоставляется только в том случае, если ваше приложение подписано с помощью ключа подписи прошивки или вы установлены в привилегированном системном разделе.

До Android 6.0 уровень защиты для CLEAR_APP_CACHE был опасным, поэтому обычные приложения могли запрашиватьэто в манифесте.

...