10

我正在编写一个应用程序来通知用户非常时间敏感的信息,我认为他们中的很多人会想要使用电话铃声而不是短的通知声音。我通过在我的PreainencesCreen中设置来启用此功能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);
4

3 回答 3

12

这应该这样做。

....
mediaPlayer.start();
....
final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mediaPlayer.isPlaying())
                mediaPlayer.stop();
        }
    }, timeout);
于 2012-07-21T17:36:37.987 回答
7

Android 不允许您干扰播放声音的通知,但如果您可以完全控制正在播放的铃声,那么您可以在 30 秒后停止它或做任何您想做的事情。

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

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

1) 如果您正在现场执行通知:创建一个 MediaPlayer 对象,在您启动通知后立即开始播放用户选择的铃声。然后使用 Timer 和 TimerTask 计数 30 秒(请参阅此处有关如何使用它们的示例)或ScheduledThreadPoolExecutor并调用 MediaPlayer stop() 以在 30 秒后停止铃声。

2) 如果您要在以后安排通知:设置通知后,请立即创建一个AlarmManager并安排它,以便它与您的通知同时触发。您的警报可能会触发您编写的另一个后台服务,在该服务中,您使用 MediaPlayer 对象播放铃声 30 秒,如第 1 部分所述)。

在这两种情况下,通知仍然存在,您播放铃声的方式将完全独立于它。您将完全控制铃声。如果用户直到那个时间还没有检查通知,您甚至可以在某个预定时间后再重播 30 秒(因为您说通知提供了非常时间敏感的信息,否则我不会用铃声播放来打扰用户坚持)。

于 2012-07-21T01:44:40.070 回答
1

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

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

于 2012-07-26T10:53:39.183 回答