在 Android M 中,来电响铃时更改铃声模式没有任何效果

In Android M, changing the ringer mode while the incoming call is ringing doesn't have any effect

前段时间我做了一个应用程序,当某个人来电时,它会改变响铃模式。因此,当其中一个人呼叫时,它会更改响铃模式,使呼叫以最大音量响铃。我用

setRingerMode(AudioManager.RINGER_MODE_NORMAL)
am.setStreamVolume(AudioManager.STREAM_RING, am.getStreamMaxVolume(AudioManager.STREAM_RING), 0);

该应用还将中断过滤器更改为 INTERRUPTION_FILTER_ALL,但为方便起见,我们假设未启用“请勿打扰”。因此,例如,如果 phone 设置为振动,当有来自匹配联系人的来电时,它会打开铃声,并将音量设置为最大。

在我使用 Marshmallow (Nexus 6P) 获得 phone 之前一切正常。现在,如果有来电,我的应用程序会照常更改响铃模式和音量,但来电不会受到影响。它的行为方式仍然相同,即使铃声设置已更改。我可以验证我的应用确实在进行更改——通话结束后,铃声音量设置完全符合预期。如果有另一个电话打进来,那个电话会正常响铃。响铃模式更改似乎并未应用于正在进行的来电。

对于导致此问题的 Marshmallow 发生的变化以及是否有解决办法,有人有任何建议吗?

所以,我找到了解决这个问题的方法。我仍然不知道如何修复这个错误(或者为什么它首先存在),但我的解决方法效果很好。除了告诉 OS 更改响铃模式外,我还手动检索默认铃声,并在来电时在应用程序中播放:

Uri alertUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), alertUri);
if(r != null && !r.isPlaying()){
    r.play();
}

然后,当来电停止响铃时,我手动停止那个Ringtone

我在 Marshmallow 上遇到了同样的问题,我找到了 Xposed Framework 的解决方案。 这个模块解决了这个问题: http://repo.xposed.info/module/com.gzplanet.xposed.ringerandnotificationvolumeunlink