Android:检测请勿打扰状态?

时间:2015-07-13 15:13:47

标签: android settings android-5.0-lollipop volume

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

4 个答案:

答案 0 :(得分:17)

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

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

Global.getInt(getContentResolver(), "zen_mode")

那将会回归:

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

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

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

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

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

答案 1 :(得分:14)

来自Android how to turn on do not disturb (dnd) programmatically的指针:

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

它应该返回以下之一:

  • INTERRUPTION_FILTER_PRIORITY
  • INTERRUPTION_FILTER_ALARMS
  • INTERRUPTION_FILTER_NONE
  • INTERRUPTION_FILTER_ALL
  • INTERRUPTION_FILTER_UNKNOWN

根据Google Help on Nexus Devices 请勿打扰是Android> = 6.0的功能,因此SDK 23应该是合理的。如果不是,我认为为什么能够提供解决方法是合理的。

答案 2 :(得分:0)

您需要先添加到清单文件,然后才能更改音频设置。为了能够将铃声模式设置为静音,您必须请求访问通知策略的权限

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

然后要检测“请勿打扰”,您可以执行以下操作

NotificationManager notificationManager = (NotificationManager) getActivity().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);

// Check if the notification policy access has been granted for the app.
if (!notificationManager.isNotificationPolicyAccessGranted()) {
     Intent intent = new 
     Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
     startActivity(intent);
     return;
}
ToggleDoNotDisturb(notificationManager);
        

private void ToggleDoNotDisturb(NotificationManager notificationManager) {
    if (notificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_ALL) {
            notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
            audioToggle.setText(R.string.fa_volume_mute);
    } else {
            notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
            audioToggle.setText(R.string.fa_volume_up);
    }
}

还需要检查权限

     NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);

 // Check if the notification policy access has been granted for the app.
 if (!mNotificationManager.isNotificationPolicyAccessGranted()) {
     Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
     startActivity(intent);
 }

答案 3 :(得分:0)

NotificationManager.Policy a = null;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            a = mNotificationManager.getNotificationPolicy();

            Log.d(TAG, "onClickDND: "+a.priorityCallSenders);
            Log.d(TAG, "onClickDND: "+a.priorityCategories);
        }

输出

--------------------------------------
 FROM ANYONE
    call senders    :   0
    categories      :   109
    Message         :   0
    State           :   1


 FROM CONTACTS ONLY
    call senders    :   1
    categories      :   109
    Message         :   1
    State           :   1


 FROM STARRED CONTACTS ONLY
    call senders    :   2
    categories      :   109
    Message         :   2
    State           :   1

 NONE
    call senders    :   2
    categories      :   97
    Message         :   2
    State           :   1