我只是想知道是否有办法检查 Android设备(21 +)是否处于“请勿打扰”模式?我知道那里AudioManager.RINGER_MODE_SILENT
,但我想知道这是否属于这种情况,或者是否有更好的检查方法?
答案 0 :(得分:17)
我带着这篇帖子的死神,但我只是在寻找解决同样问题的方法,并且像我一样过了这篇文章,所以我将为未来的参考留下一个解决方案。
我找不到“官方”的方法来做到这一点,但确实找到了一个可以将DnD状态作为整数返回的值。该功能在内部称为“zen_mode”,因此您可以使用以下代码检查当前值:
Global.getInt(getContentResolver(), "zen_mode")
那将会回归:
当设置仅为优先级时,它不返回任何内容,但您可以通过假设没有消息=优先消息模式来确定该状态。这一定是一个错误,因为现在是一年,现在返回一个像其他状态一样的值。不知道什么时候修复,但它现在可以按照您的预期工作。
我也试过了一个设置观察器,它只能用于某些状态转换,所以我认为定期轮询是最好的选择,直到听到这种状态变化的“官方”方式变为可用。
我已经包含了在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