Android:检测请勿打扰状态?

Pau*_*uiz 23 settings android volume android-5.0-lollipop

我只是想知道是否有办法检查Android设备(21+)是否处于"请勿打扰"模式?我知道有AudioManager.RINGER_MODE_SILENT,但我想知道这是否属于这种情况,或者是否有更好的方法来检查?

ssi*_*ice 19

使用Android的指针如何以编程方式打开请勿打扰(dnd):

SDK 23中,android.app.NotificationManager提供了您需要的接口,即NotificationManager.getCurrentInterruptionFilter().

它应该返回以下之一:

  • INTERRUPTION_FILTER_PRIORITY
  • INTERRUPTION_FILTER_ALARMS
  • INTERRUPTION_FILTER_NONE
  • INTERRUPTION_FILTER_ALL
  • INTERRUPTION_FILTER_UNKNOWN

根据Nexus设备上的Google帮助 请勿打扰是Android> = 6.0的功能,因此SDK 23应该是合理的.如果不是,我认为有理由问为什么能够提供解决方法.


Mat*_*att 18

我带着这篇文章的死神,但只是在寻找同样问题的解决方案,并且像我一样过了这篇文章,所以我留下了解决方案以备将来参考.

我找不到一个"官方"的方法来做到这一点,但确实找到了一个可以将DnD状态作为整数返回的值.该功能在内部称为"zen_mode",因此您可以使用以下代码检查当前值:

Global.getInt(getContentResolver(), "zen_mode")
Run Code Online (Sandbox Code Playgroud)

那会回来:

  • 0 - 如果DnD 关闭.
  • 1 - 如果DnD 打开 - 仅限优先
  • 2 - 如果DnD 打开 - 总沉默
  • 3 - 如果DnD 打开 - 仅警报

当设置仅为优先级时,它不返回任何内容,但您可以通过假设没有消息=优先消息模式来确定该状态.这肯定是一个错误,因为现在是一年,现在返回一个像其他状态一样的值.不知道什么时候修复,但它现在按照你的预期工作.

我也试过了一个设置观察器,它只能用于某些状态转换,所以我认为定期轮询是最好的选择,直到听到这种状态改变的"官方"方式变得可用.

我已经包含了获取此Gist中值的观察者和轮询方法.希望它能帮助/拯救别人一段时间.

2017年3月15日更新:感谢David Riha的评论.添加1 - Priority Only要回答的状态,修改Gist以识别该状态,并输出未知值以记录以防任何其他设备或将来的更新决定返回不同的值.