无法获得 WRITE_SETTINGS 权限

新手上路,请多包涵

当我在 Android M Preview 3 上的目标 API 为 23 时,我似乎无法获得 Manifest.permission.WRITE_SETTTINGS 权限。

 requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS}, 101);

请求权限不会弹出我期望的对话框,但是如果我在没有此权限的情况下进行以下调用,

  RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);

除非我没有权限,否则电话会。

我不知道从这里去哪里。 23 有新的铃声 API 吗?还是这种权限更改只是使任何非系统应用程序无法更改铃声?

原文由 Justin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

要使用 WRITE_SETTINGS ,基于文档:

  1. 清单中的 <uses-permission> 元素正常。

  2. 调用 Settings.System.canWrite() 看看你是否有资格写出设置。

  3. 如果 canWrite() 返回 false ,请启动 ACTION_MANAGE_WRITE_SETTINGS 活动,以便用户可以在那里同意允许您的应用程序实际写入设置。

换句话说,写入设置现在是双重选择(同意安装,在设置中单独同意以允许),类似于设备管理 API、可访问性服务等。

另请注意,我还没有尝试使用这些 - 这是基于 我昨天对 Android 6.0 更改所做的研究

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 4.0 许可协议

Kotlin Version in Simple Steps

按着这些次序:

1 、在 manifest.xml 中添加权限的使用元素正常:

 <uses-permission
    android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />

2. 要更改设置的地方,请检查写入权限:

 if (context.canWriteSettings) {
    // change the settings here ...
} else {
    startManageWriteSettingsPermission()
}

3. 在请求权限的情况下,还要添加这些代码行:

 private fun startManageWriteSettingsPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent(
            Settings.ACTION_MANAGE_WRITE_SETTINGS,
            Uri.parse("package:${context.packageName}")
        ).let {
            startActivityForResult(it, REQUEST_CODE_WRITE_SETTINGS_PERMISSION)
        }
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when (requestCode) {
        REQUEST_CODE_WRITE_SETTINGS_PERMISSION -> {
            if (context.canWriteSettings) {
                // change the settings here ...
            } else {
                Toast.makeText(context, "Write settings permission is not granted!", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

val Context.canWriteSettings: Boolean
    get() = Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.System.canWrite(this)

companion object {
    private const val REQUEST_CODE_WRITE_SETTINGS_PERMISSION = 5
}

原文由 aminography 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题