Android API 23中的Settings.System API行为

9

在我的应用程序中,目标SDK版本为23,在使用API Settings.System.putString()时发生以下错误并导致应用程序崩溃:

"AndroidRuntime: java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings."

尝试解决方案之后,在由ACTION_MANAGE_WRITE_SETTINGS打开的屏幕中授予应用程序写入权限后,仍会出现错误"You cannot keep your settings in the secure settings"。需要参考以下链接:
Can't get WRITE_SETTINGS permission

现在只有OEM开发的应用程序才能请求WRITE_SETTINGS权限吗?
是否有可能找到解决方案?

以下是在M OS上测试的一段示例代码。

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

1
你能否发布更多的代码来展示你如何使用它? - Sharjeel
之前在Android M 6.0中的RingtoneManager - Manifest.permission.WRITE_SETTINGS错误的解决方案不起作用。"Is not effective"的意思是“没有效果”。 - CommonsWare
好的,那么接下来是Sharj的评论:你需要提供一个最小、完整且可验证的示例,以便我们能够帮助您。在这种情况下,这将包括完整的堆栈跟踪,以及从该堆栈跟踪引用的代码。 - CommonsWare
@CommonsWare:添加了带有堆栈跟踪的代码。 - Hemant Tiwari
@Sharj:已添加带有堆栈跟踪的代码。 - Hemant Tiwari
显示剩余2条评论
1个回答

6

您的代码应该在所有版本的Android上失败。如果它在Android 6.0之前有效,那是一个已经修复的错误。

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


是的,看起来这个检查只在Android 6.0中添加。标准平台设置上的写操作是正常工作的。 - Hemant Tiwari
@Benny 你能解释一下如何解决这个问题吗?我也遇到了同样的问题。权限已经被授予,但错误消息仍然存在。HTC智能手机。 - Marcello Câmara
@MarcelloCâmara,我的建议是将应用程序作为系统应用程序制作,通过将.apk复制到设备的system/priv-app目录中来实现。您需要访问权限才能执行此操作。但这种方法并不适合所有人。 - Benny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接