vibrate_when_ringing Android 棉花糖 (6.0)

vibrate_when_ringing on Android Marshmallow (6.0)

在我的代码中我有:

Settings.System.putInt(this.getContentResolver(), "vibrate_when_ringing", isVibrateWhenRinging ? 1 :0);

使用以下权限:

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

这从 Jelly Bean (API 16) 到 Lollipop (API 22) 都运行良好。

在 Android M 中,我知道要使用该权限,我需要提示用户 Settings.ACTION_MANAGE_WRITE_SETTINGS

但是,即使启用了该权限,我仍然看到以下错误:

E/AndroidRuntime: java.lang.IllegalArgumentException: You cannot change private secure settings.
E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
E/AndroidRuntime:     at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)

嗯...我错过了什么吗?通过适当的权限,我们可以更改铃声、请勿打扰模式等。但是看起来 Android M 我们将无法更改 "Vibrate when ringing" 这样的正常设置。希望我是错的。

您应该调用 Settings.System.canWrite() 以查看是否可以编写此设置。

如果函数 returns 为 false,则用户可以同意允许您的应用写入设置:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);

我要回答我自己的问题。 Google 有一个问题:https://code.google.com/p/android/issues/detail?id=194376

基本上,他们部分修复了 vibrate_when_ringing 并且它在 Android N (24) 上再次起作用。不幸的是,它不适用于 Android M (23)。对于这个问题的回复,好像不会修复。

您可以在此处查看完整的示例存储库:https://github.com/ferrannp/VibrateWhenRinging

所以,基本上,您的代码需要检查您是否在 Android M 上,如果是,请不要使用该设置。