"您无法更改私人安全设置" - 如何在Android 6中切换铃声振动?

时间:2015-10-12 00:56:06

标签: android android-permissions android-6.0-marshmallow

由于Android 6 Marshmallow最近有关权限的更改,以下代码不再有效并引发异常。

Settings.System.putInt(getContentResolver(), "vibrate_when_ringing", 0);

即使在向应用授予WRITE_SETTINGS权限后,也会发生这种情况:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, WRITE_SETTINGS_PERMISSION_REQUEST_CODE);
//at this point Settings activity is opened and user is prompted for permission

...

if (Settings.System.canWrite(this)) { //now returns true, because permissions were granted
    Settings.System.putInt(getContentResolver(), "vibrate_when_ringing", 0); //still crashes
} else {
    Log.w(LOG_TAG, "No permission to write settings.");
}

如何在Android 6中更改铃声振动设置(以及类似的安全设置)?

完整堆栈跟踪:

10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: Writing exception to parcel
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: java.lang.IllegalArgumentException: You cannot change private secure settings.
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:1173)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at com.android.providers.settings.SettingsProvider.enforceRestrictedSystemSettingsMutationForCallingPackage(SettingsProvider.java:1030)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:906)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at com.android.providers.settings.SettingsProvider.insertSystemSetting(SettingsProvider.java:874)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:257)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at android.content.ContentProvider$Transport.call(ContentProvider.java:398)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:283)
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils:     at android.os.Binder.execTransact(Binder.java:453)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: FATAL EXCEPTION: IntentService[DetectedActivityIntentService]
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: Process: <package_name>, PID: 10084
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: java.lang.IllegalArgumentException: You cannot change private secure settings.
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:1322)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.provider.Settings$System.putStringForUser(Settings.java:1671)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.provider.Settings$System.putIntForUser(Settings.java:1776)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.provider.Settings$System.putInt(Settings.java:1770)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at <package_name>.DetectedActivityIntentService.activate(DetectedActivityIntentService.java:116)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at <package_name>.DetectedActivityIntentService.onHandleIntent(DetectedActivityIntentService.java:94)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime:     at android.os.HandlerThread.run(HandlerThread.java:61)

2 个答案:

答案 0 :(得分:4)

因为安全

众所周知,在Android 6.0(Marshmallow)中,Android添加了许多策略来控制 SECURITY ,提升效率 如:

  • 运行时权限
  • 打盹模式(电源管理器)
  • 重写设置提供商 see details
    • 将系统设置从db移至xml
    • /data/data/com.android.providers.settings /../ settings.db - &gt; /数据/系统/用户/用户ID / settings_ [系统|全球|安全]的.xml

所以现在(在API 22之后)

  • 您可以写一些私密/危险设置
  • 必须在移植到API级别22或更高版本期间处理某些 EXCEPTION see details

PS

need deal with some EXCEPTION

can not change

答案 1 :(得分:0)

基于this ticket问题似乎在12月9日得到解决。问题将在未来的构建中修复。

问题由Stack Overflow成员打开并讨论here