【问题标题】:Settings.System API behaviour in Android API level 23Android API 级别 23 中的 Settings.System API 行为
【发布时间】:2016-01-03 11:33:42
【问题描述】:

在我的应用程序中,targetSdkVersion 为 23,同时使用 API Settings.System.putString()

引发以下错误并且应用程序崩溃
"AndroidRuntime: java.lang.IllegalArgumentException: 您不能将您的设置保存在安全设置中。"

在尝试解决方案后
Can't get WRITE_SETTINGS permission
并在 ACTION_MANAGE_WRITE_SETTINGS 打开的屏幕中授予应用程序写入权限。该应用程序仍然收到错误“您无法将设置保留在安全设置中”。

现在是否仅针对 OEM 开发的应用请求 WRITE_SETTINGS 权限? 有没有可能的解决方案?

分享一个示例代码,在 M OS 的 Nexus 5 设备上测试。

Android 清单片段:

    android:minSdkVersion="17"  
    android:targetSdkVersion="23"  
    uses-permission android:name="android.permission.WRITE_SETTINGS"

代码片段:

protected void onResume() {
    super.onResume();
    boolean canDo =  Settings.System.canWrite(this);
    if (false == canDo)
    {
        Intent grantIntent = new   Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
        startActivity(grantIntent);
    }
    else
    {   
        Settings.System.putString(this.getContentResolver(),
            "test.hemant", "hemantval");
    }           

}

日志栈:

E/DatabaseUtils(  779): Writing exception to parcel
E/DatabaseUtils(  779): java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings.
E/DatabaseUtils(  779):     at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:1175)
E/DatabaseUtils(  779):     at com.android.providers.settings.SettingsProvider.enforceRestrictedSystemSettingsMutationForCallingPackage(SettingsProvider.java:1030)
E/DatabaseUtils(  779):     at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:906)
E/DatabaseUtils(  779):     at com.android.providers.settings.SettingsProvider.insertSystemSetting(SettingsProvider.java:874)
E/DatabaseUtils(  779):     at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:257)
E/DatabaseUtils(  779):     at android.content.ContentProvider$Transport.call(ContentProvider.java:398)
E/DatabaseUtils(  779):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:283)
E/DatabaseUtils(  779):     at android.os.Binder.execTransact(Binder.java:453)
D/AndroidRuntime(19935): Shutting down VM

【问题讨论】:

  • 你能发布更多代码来展示你是如何使用它的吗?
  • “Android M 6.0 RingtoneManager 早期的解决方案 - Manifest.permission.WRITE_SETTINGS 错误无效” -- 请解释一下“无效”是什么意思。
  • @CommonsWare:感谢您的帮助。这意味着在按照上述链接中提到的步骤并在 ACTION_MANAGE_WRITE_SETTINGS 打开的屏幕中授予应用程序写入权限之后。该应用仍然收到错误“您无法将您的设置保留在安全设置中”。
  • 好的,那么我回来了 Sharj 的评论:您需要提供 minimal, complete, and verifiable example 以便我们能够为您提供帮助。在这种情况下,这将是完整的堆栈跟踪,以及从该堆栈跟踪引用的代码。
  • @CommonsWare:添加了带有堆栈跟踪的代码。

标签: android permissions settings


【解决方案1】:

您的代码在所有版本的 Android 上都应该失败。如果它在 Android 6.0 之前有效,那显然是刚刚修复的错误。

Settings.System 用于平台定义的设置。您不能在其中放置任意设置,例如test.hemant

【讨论】:

  • 是的,这个检查似乎只在 Android 6.0 中添加。标准平台设置上的写入操作正在运行。
  • @Benny 你能解释一下如何解决这个问题吗?我有同样的问题。已授予权限,但错误消息仍然存在。 HTC 智能手机
  • @MarcelloCâmara,我的建议是将应用程序作为系统应用程序,将.apk 复制到设备的system/priv-app 目录中。您需要访问权限才能执行此操作。而且这种方法并不适合所有人。
猜你喜欢
  • 2016-03-06
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2016-04-10
  • 2016-11-18
  • 2019-05-17
  • 2016-12-04
相关资源
最近更新 更多