尽管已经授予了权限,但仍获得了安全例外

时间:2017-01-11 02:57:30

标签: android permissions manifest securityexception

我的应用程序没有获得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);

在有人问之前,是的,它需要在我设置我的应用程序之外的活动之外

1 个答案:

答案 0 :(得分: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()
}