【问题标题】:What to listen for to detect do-not-disturb mode changes in Android?听什么来检测 Android 中的请勿打扰模式变化?
【发布时间】:2016-10-03 21:42:22
【问题描述】:

我希望我的应用程序在手机设置为免打扰模式(仅警报、仅优先级或完全静音)时显示通知。在快速设置中检查此模式并在已选择的选项卡中选择模式时,通过收听android.media.RINGER_MODE_CHANGED 可以很好地工作。但是在选择另一个标签时,它不会再次触发。所以我的应用程序有错误的模式信息并显示错误的通知。

我再次尝试android.app.action.INTERRUPTION_FILTER_CHANGED,但在上述情况下根本没有被解雇。

由于我想立即获悉,我不想使用投票观察员。就我而言,我预计会大量消耗电池电量。

有一个类似的问题,但没有针对它的听众解决方案:

Android: Detect Do Not Disturb status?

希望在此期间可能有一个解决方案,我想再次问这个问题:有没有人有好主意或提示要听什么?

更新:

这是 AndroidManifest.xml 中的广播接收器定义......要清楚这一点:接收器在振铃模式更改时调用,也检测到飞行模式和摘机,但不是在所有振铃模式下调用更改,尤其是通过快速设置中的 Tab 键或音量键在免打扰模式更改之间切换:

    <receiver android:name="UpdateStatusNotification" android:process=":remote">
        <intent-filter>
            <action android:name="android.app.action.INTERRUPTION_FILTER_CHANGED"/>
            <action android:name="android.intent.action.AIRPLANE_MODE"/>
            <action android:name="android.intent.action.PHONE_STATE"/>
            <action android:name="android.media.RINGER_MODE_CHANGED"/>
        </intent-filter>
    </receiver>

更新 2:

请阅读我对已接受答案的最后评论。

【问题讨论】:

  • 使用您的活动来检查模式更改并将其传播到您的选项卡片段?如果您想像您提到的那样节省电池,也可以尝试使用广播接收器,看来您已经在使用广播进行此操作了?
  • 是的,我有一个广播接收器,它通过检查流音量来更新通知。它确实会正确更新通知,if 调用。但并非在所有情况下都调用它,尤其是在快速设置中切换不同模式时。该应用程序主要在后台休眠,只有警报管理器才会激活以定期响铃。因此,大多数时候我没有积极的活动。
  • 在这种情况下您不需要警报管理器,配置文件的更改应该触发所有必要的广播接收器,请发布您如何实现它的代码。如果一切正常,为什么您没有收到通知似乎很奇怪
  • 你是对的,警报管理器与检测模式变化无关。我只是提到它来解释为什么我的应用程序主要在后台。我已将广播接收器定义添加到问题中。

标签: android


【解决方案1】:

广播接收器动作是:

NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED

IntentFilter intent = new IntentFilter();
intent.addAction(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED);

下面的代码应该在接收器中。

if(intetn.getAction().equals(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED) {
    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    if(mNotificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_ALARMS) {
        //do your stuff
    } else if (mNotificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_NONE) {
        //....
    } else if (mNotificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_ALL) {
        //....
    } else if (mNotificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_PRIORITY) {
        //....
    } else if (mNotificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_UNKNOWN) {
        //....
    }
}

【讨论】:

  • 但是我应该在 AndroidManifest.xml 中接收器的 标记的 标记中添加 android:name 是什么意思?我不明白你想用你的第一个代码块告诉我什么——据我了解,它什么也没做。接收端已经运行良好。
  • 您创建了静态接收器,因此您必须在清单中添加&lt;action android:name="NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED"/&gt;,根据我的理解,请勿打扰将适用于此操作,但在接收器中您将获得以下操作。我所创造的是动态接收器。所以我需要添加注册和注销接收器的代码。
  • 通过此操作,系统将触发广播 1. 仅警报 2. 完全静音
  • NotificationManager.ACTION_INTERRUPTION_FILTER‌​_CHANGED 解析为"android.app.action.INTERRUPTION_FILTER_CHANGED",这不像我的问题中所述那样工作。但是,我尝试了&lt;action android:name="NotificationManager.ACTION_INTERRUPTION_FILTER‌​_CHANGED"/&gt;,但正如预期的那样并没有解决我的问题。当您在请勿打扰快速设置中更改选项卡时,不会调用广播接收器。
  • 根据您的回答,我发现android.app.action.INTERRUPTION_FILTER_CHANGED 正在 当且仅当动态注册(使用 registerReceiver)时才会被触发。这需要我的应用程序处于活动状态,这不是我想要的。如果是静态注册的(通过 AndroidManifest.xml),它not 被触发。所以我创建了一个issue。我将把操作添加到我的AndroidManifest.xml 以防它得到修复,接受您的回答并更新我的问题。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多