2012-07-14 11 views
9

Estoy escribiendo una aplicación que notifica a un usuario de información muy sensible al tiempo, y creo que muchos de ellos querrían utilizar un tono de llamada en lugar de solo los sonidos cortos de notificación. He habilitado esta función configurando android:ringtoneType="all" en mi PreferenceScreen, y funciona genial, EXCEPTO que cuando se elige un tono de llamada, se reproduce FOREVER hasta que el usuario toque la barra de notificaciones ... ¿cómo puedo hacer que se apague después de 30 segundos o Entonces, ¿sin cancelar la notificación?¿Cómo detener el tono de llamada de notificación de Android después de 30 segundos?

aquí está el código que estoy utilizando en mi C2DM receptor:

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

offtopic: C2DM está en desuso reescribirlo usando Google Clound Messaging (GCM) –

Respuesta

6

Android no le dan acceso a interferir con la notificación de la reproducción del sonido, pero si usted tiene el control total de la melodía que está jugando , luego puedes detenerlo después de 30 segundos o hacer lo que quieras con él.

Aquí, supongo que está utilizando un servicio en segundo plano para ejecutar la notificación.

Como paso preliminar, debe realizar la notificación sin sonido. Solo una notificación de barra de tareas simple y predeterminada. Luego, usaremos nuestro propio objeto MediaPlayer para reproducir el tono de llamada durante 30 segundos.

1) SI ESTÁ EJECUTANDO LA NOTIFICACIÓN EN EL PUNTO: Cree un objeto MediaPlayer, comience a reproducir el tono de llamada que el usuario eligió justo después de iniciar la notificación. Luego cuente 30 segundos con un temporizador y TimerTask (see example here sobre cómo usarlos) o ScheduledThreadPoolExecutor y llame a MediaPlayer stop() para detener el tono de llamada después de 30 segundos.

2) SI ESTÁ PROGRAMANDO LA NOTIFICACIÓN PARA UN MOMENTO POSTERIOR: Tan pronto como configure su notificación, cree un AlarmManager y programe de modo que se active al mismo tiempo que su notificación. Su alarma podría desencadenar otro servicio en segundo plano que haya escrito en el que reproduzca el tono de llamada durante 30 segundos utilizando un objeto MediaPlayer como se explica en la parte 1).

En ambos casos, la notificación seguirá allí y la forma en que tocará el tono de llamada será totalmente independiente de ella. Tendrás control total sobre el tono de llamada. Incluso puedes reproducirlo durante otros 30 segundos después de un tiempo programado si el usuario no ha verificado la notificación hasta ese momento (ya que estás diciendo que la notificación brinda información muy sensible al tiempo, de lo contrario, no molestaría al usuario con tonos de llamada jugando insistentemente).

+0

¿Hay alguna manera cuando el usuario toca la barra de notificaciones para detectarlo y desactivar la alarma? Aparte de que sería bastante molesto tener el tono de llamada sigue jugando .. Si esa es la única alternativa que podría aconsejarles que descarguen algunos tonos de notificaciones extendidas o algo –

+0

Por supuesto, hay muchas maneras de detectarlo y todo depende de qué quieres que haga tu notificación. Luego, debe comunicarse entre la actividad resultante que recibe el intento de notificación y su servicio que contiene el objeto del reproductor multimedia y cancelar la reproducción. Aquí hay un tutorial detallado sobre cómo capturar notificaciones: http://developer.android.com/guide/topics/ui/notifiers/notifications.html – Erol

+0

No estoy hablando de cuándo se hace clic en la notificación, o incluso se descarta. Normalmente, si un usuario solo toca la parte superior de la barra de notificaciones, no se reproduce más sonido. No veo una manera de capturar eso, ¿estoy equivocado? –

11

Esto debería hacerlo.

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

¿De dónde obtuvo la instancia de mediaPlayer? – RaphMclee

1

Una solución simple sería cancelar la notificación después de 30 segundos y crear una nueva.

Incluso podría clonar la Notificación original y simplemente eliminar el tono de llamada para la nueva.

+0

¿cómo puedo detectar si la notificación ya ha sido cancelada por el usuario, por lo que no estoy simplemente colocando una notificación duplicada después de que ya hayan hecho clic en ella? –

Cuestiones relacionadas