2012-07-14 11 views
9

Sto scrivendo un'app che notifica all'utente informazioni molto sensibili al tempo e penso che molti di loro vorrebbero utilizzare una suoneria del telefono invece dei soli suoni di notifica brevi. Ho abilitato questa funzione impostando android:ringtoneType="all" nel mio PreferenceScreen, e funziona benissimo ECCETTO che quando si sceglie una suoneria del telefono, continua a suonare FOREVER finché l'utente non tocca la barra di notifica ... come posso farlo spegnere dopo 30 secondi o quindi, senza cancellare la notifica?Come interrompere la suoneria di notifica Android dopo 30 secondi?

Heres il codice che sto utilizzando nel mio ricevitore 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

offtopic: C2DM è deprecato riscritto utilizzando Google Clound Messaging (GCM) –

risposta

6

Android non dà accesso ad interferire con la notifica la riproduzione del suono, ma se si ha il pieno controllo della suoneria si sta giocando , quindi puoi fermarlo dopo 30 secondi o fare quello che vuoi con esso.

Qui, presumo che si stia utilizzando un servizio in background per eseguire la notifica.

Come fase preliminare, è necessario effettuare la notifica senza audio. Solo una semplice notifica sulla barra delle applicazioni predefinita. Quindi, useremo il nostro oggetto MediaPlayer per riprodurre la suoneria per 30 secondi.

1) SE STAI ESEGUENDO LA NOTIFICA SULLO SPOT: Crea un oggetto MediaPlayer, inizia a riprodurre la suoneria che l'utente ha selezionato subito dopo aver avviato la notifica. Quindi conta 30 secondi con un Timer e un TimerTask (see example here su come usarli) o ScheduledThreadPoolExecutor e chiama MediaPlayer stop() per interrompere la suoneria dopo 30 secondi.

2) SE SI STABILISCE LA NOTIFICA PER UN SECONDO TEMPO: Non appena si imposta la notifica, creare uno AlarmManager e pianificarlo in modo che venga attivato contemporaneamente alla notifica. La sveglia potrebbe attivare un altro servizio in background che hai scritto in cui suoni la suoneria per 30 secondi utilizzando un oggetto MediaPlayer come spiegato nella parte 1).

In entrambi i casi, la notifica sarà ancora presente e il modo in cui suonerete la suoneria sarà totalmente indipendente da esso. Avrai il pieno controllo della suoneria. Puoi persino riprodurlo per altri 30 secondi dopo un certo periodo di tempo programmato se l'utente non ha controllato la notifica fino a quel momento (dal momento che stai dicendo che la notifica fornisce informazioni molto sensibili al tempo, altrimenti non farei bug all'utente che suonava suonerie insistingly).

+0

c'è un modo quando l'utente tocca la barra di notifica per me per rilevarlo e disattivare l'allarme? Altro che sarebbe piuttosto noioso avere la suoneria continua a suonare .. Se questa è l'unica alternativa potrei semplicemente consigliare loro di scaricare alcuni toni di notifiche estese o qualcosa del genere –

+0

Naturalmente, ci sono molti modi per rilevarlo e tutto dipende da cosa vuoi che la tua notifica faccia. Quindi, è necessario comunicare tra l'attività risultante che riceve l'intento della notifica e il proprio servizio contenente l'oggetto mediaplayer e annullare la riproduzione. Ecco un tutorial dettagliato su come acquisire le notifiche: http://developer.android.com/guide/topics/ui/notifiers/notifications.html – Erol

+0

Non sto parlando di quando si fa clic sulla notifica, o addirittura si elimina. Intendo normalmente se un utente tocca solo la parte superiore della barra delle notifiche, non viene riprodotto alcun suono. Non vedo un modo per catturarlo, ho sbagliato? –

11

Questo dovrebbe farlo.

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

Da dove hai preso l'istanza di mediaPlayer? – RaphMclee

1

Una soluzione semplice sarebbe annullare la notifica dopo 30 secondi e crearne una nuova.

È anche possibile clonare la notifica originale e rimuovere solo la suoneria per la nuova.

+0

come faccio a sapere se la notifica è già stata cancellata dall'utente, quindi non sto solo facendo una notifica doppia dopo che l'hanno già cliccata? –

Problemi correlati