如何在30秒后停止Android通知铃声?

时间:2012-07-14 19:17:14

标签: android android-notifications

我正在编写一个应用程序,通知用户非常时间敏感的信息,我认为他们中的很多人会想要使用手机铃声而不是短暂的通知声音。我通过在我的PreferenceScreen中设置android:ringtoneType="all"来启用此功能,除非选择了手机铃声,它会一直播放,直到用户触摸通知栏...我怎么能让它关闭呢? 30秒左右后,没有取消通知?

下面是我在C2DM接收器中使用的代码:

NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notif = new Notification(....)
....
String ringtone = PreferenceManager.getDefaultSharedPreferences(context).getString("ringtone", "");
notif.sound = Uri.parse(ringtone);
notif.audioStreamType = AudioManager.STREAM_NOTIFICATION;
nm.notify(1, notif);

3 个答案:

答案 0 :(得分:11)

这应该这样做。

....
mediaPlayer.start();
....
final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mediaPlayer.isPlaying())
                mediaPlayer.stop();
        }
    }, timeout);

答案 1 :(得分:7)

Android不会让您干扰播放声音的通知,但如果您完全控制正在播放的铃声,那么您可以在30秒后停止播放,或者随意使用它。

在这里,我假设您正在使用后台服务来执行通知。

作为初步步骤,您应该在没有声音的情况下发出通知。只是一个默认的简单任务栏通知。然后,我们将使用我们自己的MediaPlayer对象播放铃声30秒。

1)如果你在SPOT上执行通知:创建一个MediaPlayer对象,开始播放用户在你开始通知后立即选择的铃声。然后使用Timer和TimerTask(see example here如何使用它们)或ScheduledThreadPoolExecutor计算30秒,并在30秒后调用MediaPlayer stop()停止铃声。

2)如果您计划通知一段时间:一旦您设置了通知,请创建AlarmManager并安排它,以便在通知的同时触发通知。您的警报可以触发您使用MediaPlayer对象播放铃声30秒的其他后台服务,如第1部分所述。

在这两种情况下,通知仍然存在,您播放铃声的方式将完全独立于此。您将完全控制铃声。如果用户在此之前没有检查通知,您甚至可以在一段预定时间后再重播30秒(因为您说该通知提供了非常时间敏感的信息,否则我不会因铃声播放而对用户造成错误insistingly)。

答案 2 :(得分:1)

一个简单的解决方法是在30秒后取消通知并创建一个新通知。

您甚至可以克隆原始通知,只删除新通知的铃声。