我有一个具有提醒功能的应用程序。当需要提醒用户某些内容时,我的应用程序会创建一条通知,可能使用FLAG_INSISTENT来确保警报被听到。用户与我的应用程序交互以确认警报后,该应用程序将取消通知。
用户可以通过下拉通知栏并点击我的通知(在这种情况下一切正常)来启动应用程序,也可以通过其他方式导航至该应用程序,例如从主屏幕启动该应用程序。如果用户使用通知栏方法,则当用户触摸通知栏时,FLAG_INSISTENT音频将停止。但这是问题所在:如果用户直接进入应用程序而没有触摸通知栏。 FLAG_INSISTENT警报的音频会无限期播放-即使在我的应用取消通知之后。用户停止它的唯一方法是拉下通知栏(或重新启动设备!)。
自从可选FLAG_INSISTENT功能上线以来,我一直在从愤怒的用户那里收到大量错误报告。它似乎并不特定于一个平台。报告此错误的用户使用的硬件包括Motorol Razr Maxx HD,Samsung 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添加到通知中;那没有效果。解决方法是,我还尝试修改cancel方法,以便它首先发出没有声音且没有FLAG_INSISTENT的新通知,然后取消;再次,音频只是继续播放。
有任何想法吗?
没有办法使声音静音,但是解决方法是,使音频简短,不可重复,并且如果可能的话,只需取消整个通知,然后在没有声音的情况下再次发布即可。
正如我在帖子的最后部分中提到的那样,我已经尝试取消整个通知,然后在没有声音的情况下重新发布它。 声音仍在继续。 音频的长度无关紧要,因为根据问题的定义(因为Im是用FLAG_INSISTENT发布的),无论它是什么,它都会不断重复音频。
我确定此链接可以解决您的问题:stackoverflow.com/questions/2261539/
该帖子只是建议取消通知-我已经在这样做了。 问题是,即使取消通知,声音仍会继续播放。
我遇到了同样的问题。取消通知后,音频将继续播放。
我制定了这项工作,
执行正常的通知已取消。mNotificationManager.cancel(getNotificationID(event));
立即创建另一个带有声音的通知。使用默认的警报。
立即取消通知。
注意:
通知中播放的声音不是默认声音。
方法getNotificationID(event)始终为相同的事件对象类型返回相同的常量。
取消通知后,使用默认播放声音的通知将停止。
我使用构建器使用此设置声音
setSound(Uri.parse(this.sharedPreferences.getString(key,"")))
从观察结果来看,我认为这可能是一个错误。没有正确保留对铃声对象的引用,因此在调用cancel时,它无法在铃声.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));
如果以上代码在您的服务类别中。然后我认为问题是当您直接打开应用程序而不是使用通知栏时,此时它没有调用您的服务类,否则您需要调用nm.cancel(NOTIFICATION_BAR_ID);。从单击通知时打开的活动中。
为此,您需要一个保留静态NOTIFICATION_BAR_ID的全局类,这样对您管理cancel方法会有所帮助。
希望能解决您的问题。
NOTIFICATION_BAR_ID是一个常量。 该应用已在取消通知,并且取消在其他所有方面都起作用(例如,图标从通知栏中消失了)。
我认为您的问题是特定于设备的。 在多种设备上测试您的应用
正如我在原始帖子中提到的那样:"它似乎并不特定于一个平台;报告此错误的用户所用的硬件包括Motorol Razr Maxx HD,三星Galaxy Note和HTC EVO 4G LTE。"