【问题标题】:Sound played with FLAG_INSISTENT notifications don't stop when my app cancels the notification当我的应用取消通知时,使用 FLAG_INSISTENT 通知播放的声音不会停止
【发布时间】:2014-07-15 17:59:01
【问题描述】:

我有一个具有提醒功能的应用程序。当需要提醒用户某事时,我的应用程序会创建一个通知,可能使用 FLAG_INSISTENT 来确保听到警报。一旦用户与我的应用交互以确认警报,应用就会取消通知。

用户可以通过下拉通知栏并点击我的通知来启动应用程序(在这种情况下一切都很好)或通过其他方式导航到应用程序,例如从主屏幕启动它.如果用户使用通知栏方法,当用户触摸通知栏时,FLAG_INSISTENT 音频停止。但问题来了:如果用户直接进入应用程序而不触摸通知栏。 FLAG_INSISTENT 警报的音频会无限期地播放——即使我的应用程序取消了通知。用户可以阻止它的唯一方法是拉下通知栏(或重新启动设备!)。

自从可选的 FLAG_INSISTENT 功能上线以来,我收到了大量来自愤怒用户的错误报告。它似乎并不特定于一个平台。报告此错误的用户拥有的硬件包括 Motorol Razr Maxx HD、三星 Galaxy Note 和 HTC EVO 4G LTE。我有沮丧的用户报告说他们卸载了应用程序来阻止噪音,即使这样说它也不会停止。在网上搜索一直没有结果。

通知的创建方式或多或少是花园式的:

notification = new Notification(
                R.drawable.icon,
                message,
                System.currentTimeMillis()
                );

if (userDefinedaCustomSound) {
   notification.sound = Uri.parse(userSelectedReminderSound);
} else {
   notification.defaults |= DEFAULT_SOUND;
}

notification.ledARGB = 0xff00ff00;
notification.ledOnMS = 300;
notification.ledOffMS = 1000;
notification.flags |= Notification.DEFAULT_VIBRATE;

if (userWantsContinuousAlarm) {
        notification.flags |= Notification.FLAG_INSISTENT;
}

NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NOTIFICATION_BAR_ID, notification);

因此被取消:

nm.cancel(NOTIFICATION_BAR_ID);

我尝试将 FLAG_AUTO_CANCEL 添加到通知中;那没有效果。作为一种解决方法,我还尝试修改我的取消方法,使其首先发出一个没有声音且没有 FLAG_INSISTENT 的新通知,然后取消;再次,音频继续播放。

有什么想法吗?

【问题讨论】:

  • 没有办法让声音静音,但解决方案是,让你的音频保持简短,不可重复,如果可能的话,取消整个通知,然后在没有声音的情况下再次发布。
  • 正如我在帖子的最后部分中提到的,我已经尝试取消整个通知,然后在没有声音的情况下重新发布。声音还在继续。音频的长度无关紧要,因为根据问题的定义(因为我使用 FLAG_INSISTENT 发布它),无论它是什么,它都会不断重复音频。
  • 我相信这个链接会解决你的问题:stackoverflow.com/questions/2261539/…
  • 那篇文章只是建议取消通知——我已经在这样做了。问题是即使在通知被取消后声音仍然在播放。

标签: android notifications


【解决方案1】:

我遇到了同样的问题。取消通知后,音频继续播放。

我制定了这项工作,

  1. 取消执行正常通知。mNotificationManager.cancel(getNotificationID(event));
  2. 立即创建另一个有声音的通知。 使用默认闹钟
  3. 立即取消通知。

注意:

  • 作为通知的一部分播放的声音不是默认的。
  • getNotificationID(event) 方法总是为相同的事件对象类型返回相同的常量。
  • 取消通知后,默认播放声音的通知将停止。
  • 我使用 builder 设置了声音 setSound(Uri.parse(this.sharedPreferences.getString(key,"")))

根据观察,我认为这可能是一个错误。对铃声对象的引用未正确保留,因此当调用取消时,它未能调用铃声.stop() 或无法这样做。

希望你也可以使用它。


NotificationManager mNotificationManager = (NotificationManager) this.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(getNotificationID(event));
audioAlarmTriggered.remove(event.sensortype);

NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
builder.setAutoCancel(true)
       .setSound(ringtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
mNotificationManager.notify(getNotificationID(event), builder.build());
mNotificationManager.cancel(getNotificationID(event));

【讨论】:

    【解决方案2】:

    如果上面的代码在您的服务类中。然后我认为问题是当您直接打开应用程序而不是使用通知栏时,它不会调用您的服务类,否则您需要调用 nm.cancel(NOTIFICATION_BAR_ID);从单击通知时打开的活动中。

    为此,您需要一个保持静态 NOTIFICATION_BAR_ID 的全局类,这将有助于您管理取消方法。

    希望这能解决你的问题。

    【讨论】:

    • NOTIFICATION_BAR_ID 是一个常数。应用程序已经在取消通知,并且取消在所有其他方面都有效(例如,图标从通知栏中消失)。
    • 我认为您的问题是特定于设备的。在多台设备上测试您的应用
    • 正如我在原始帖子中提到的,“它似乎并不特定于一个平台;报告此错误的用户拥有包括 Motorol Razr Maxx HD、三星 Galaxy Note 和 HTC EVO 4G LTE 在内的硬件。 "
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2015-02-04
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多