2017-01-11 47 views
3

我得到的應用程序沒有被授予android.permission.WRITE_SETTINGS的java.lang.SecurityException。儘管我已經加入到我的清單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"/> 

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