2017-01-11 2 views
3

Je reçois une exception java.lang.SecurityException pour mon application qui n'a pas été octroyée android.permission.WRITE_SETTINGS. même si je l'ai ajouté dans mes manifestes de fichier xmlObtention d'une exception de sécurité malgré l'obtention d'une autorisation

<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"/> 

Modifier 1: D'accord, donc j'ai ce code qui doit être exécuté dans une classe en dehors de l'activité, comment pourrais-je aller à demander une autorisation d'utilisateurs , alors s'ils l'accordent, exécutez ce code, le tout dans une classe en dehors de l'activité? -

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

Et avant que quiconque ne demande, oui, il doit être en dehors de l'activité avec elles, je sens mis en place mon application

+0

@JuanCruzSoler - 'WRITE_SETTINGS' n'est pas une autorisation que vous demandez via le modèle d'autorisations d'exécution. – ianhanniballake

Répondre

3

par le WRITE_SETTINGS documentation:

Note: Si l'application cible l'API niveau 23 ou supérieur, l'utilisateur de l'application doit accorder explicitement cette autorisation à l'application via un écran de gestion des autorisations. L'application demande l'approbation de l'utilisateur en envoyant une intention avec l'action ACTION_MANAGE_WRITE_SETTINGS. L'application peut vérifier si elle a cette autorisation en appelant Settings.System.canWrite().

Par conséquent, vous devez utiliser un code tel que:

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