2017-01-11 11 views
3

Я получаю java.lang.SecurityException для моего приложения, не получившего андроида.permission.WRITE_SETTINGS. даже если я добавил его в свои манифесты XML-файлПолучение безопасности, несмотря на предоставление разрешения

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".SoundActivity1"></activity> 
</application> 

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

Edit 1: Хорошо, так что я этот код, который должен выполняться в классе вне деятельности, как бы я идти о просить разрешения на пользователей , то, если они предоставляют его, запустите этот код, все в классе за пределами активности? -

Uri newRingtone = Uri.parse("android.resource://com.example.myapp/" + soundID); 
RingtoneManager.setActualDefaultRingtoneUri(context,RingtoneManager.TYPE_RINGTONE,newRingtone); 

И прежде чем кто спрашивает, да, она должна быть вне деятельности с их образом настроить мое приложение

+0

@JuanCruzSoler - 'WRITE_SETTINGS' не разрешение вы запрашиваете с помощью модели разрешений во время выполнения. – ianhanniballake

ответ

3

Пер с WRITE_SETTINGS documentation:

Примечание: Если приложение для целей API уровня 23 или выше, пользователь приложения должен явно предоставить это разрешение для приложения через экран управления разрешениями. Приложение запрашивает согласие пользователя, отправляя намерение с действием ACTION_MANAGE_WRITE_SETTINGS. Приложение может проверить, имеет ли он это разрешение, вызывая Settings.System.canWrite().

Поэтому вы должны использовать такой код:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && 
    !Settings.System.canWrite(this)) { 
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); 
    intent.setData("package:"+getPackageName()); 
    startActivityForResult(intent); 
    // now wait for onActivityResult() 
}