2012-07-14 4 views
9

Piszę aplikację, która powiadamia użytkownika o bardzo ważnych informacjach czasowych i myślę, że wielu z nich chciałoby użyć dzwonka telefonu zamiast tylko krótkich dźwięków powiadomień. Włączam tę funkcję, ustawiając android:ringtoneType="all" w moim PreferenceScreen, i działa to świetnie, Z WYJĄTKIEM, że po wybraniu dzwonka telefonu, gra cały czas, aż użytkownik dotknie paska powiadomień ... w jaki sposób mogę go wyłączyć po 30 sekundach lub więc bez anulowania powiadomienia?Jak zatrzymać dzwonek powiadomień z Androidem po 30 sekundach?

heres kod używam w moim odbiorniku 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

podsumowanie: C2DM jest przestarzałe przepisać go za pomocą Google Clound Messaging (GCM) –

Odpowiedz

6

Android nie daje Ci dostęp do kolidować z zawiadomieniem odtwarzania dźwięku, ale jeśli masz pełną kontrolę nad dzwonek grasz , możesz go zatrzymać po 30 sekundach lub zrobić, co chcesz.

Tutaj, zakładam, że używasz usługi w tle do wykonania powiadomienia.

Wstępnie, należy wykonać powiadomienie bez dźwięku. Po prostu domyślne, proste powiadomienie na pasku zadań. Następnie użyjemy własnego obiektu MediaPlayer, aby odtworzyć dzwonek przez 30 sekund.

1) JEŚLI ZAKTUALIZUJESZ POWIADOMIENIE NA PUNKCIE: Utwórz obiekt MediaPlayer, rozpocznij odtwarzanie dzwonka wybranego przez użytkownika zaraz po rozpoczęciu powiadomienia. Następnie policz 30 sekund za pomocą Timera i TimerTask (see example here, jak z nich korzystać) lub ScheduledThreadPoolExecutor i wywołaj funkcję MediaPlayer stop(), aby zatrzymać dzwonek po 30 sekundach.

2) JEŚLI ZACHOWAJESZ POWIADOMIENIE NA PÓŹNIEJSZY CZAS: Natychmiast po ustawieniu powiadomienia należy utworzyć AlarmManager i zaplanować, aby był on uruchamiany w tym samym czasie wraz z powiadomieniem. Twój alarm może uruchomić inną usługę w tle, którą napisałeś, w której dzwonek jest odtwarzany przez 30 sekund przy użyciu obiektu MediaPlayer, jak wyjaśniono w części 1).

W obu przypadkach powiadomienie będzie nadal dostępne, a sposób w jaki będzie odtwarzany dzwonek będzie całkowicie niezależny od niego. Będziesz mieć pełną kontrolę nad dzwonkiem. Możesz nawet odtworzyć go przez kolejne 30 sekund po pewnym czasie, jeśli użytkownik nie zaznaczył powiadomienia do tego czasu (ponieważ mówisz, że powiadomienie dostarcza bardzo poufnych informacji, inaczej nie naruszyłbym użytkownika dzwonków odtwarzających nalegając).

+0

Czy istnieje sposób, gdy użytkownik dotyka paska powiadomień, aby mnie to wykryć i wyłączyć alarm? Poza tym byłoby dość denerwujące, aby dzwonek dalej się odtwarzał. Jeśli to jedyna alternatywa, mogę po prostu doradzić mu pobranie kilku rozszerzonych tonów powiadomień lub coś takiego. –

+0

Oczywiście istnieje wiele sposobów na wykrycie tego i wszystko zależy od tego, co chcesz zrobić powiadomienie. Następnie powinieneś komunikować się między wynikową działalnością otrzymującą intencję powiadomienia a twoją usługą trzymającą obiekt mediaplayer i anuluj odtwarzanie. Oto szczegółowy samouczek dotyczący przechwytywania powiadomień: http://developer.android.com/guide/topics/ui/notifiers/notifications.html – Erol

+0

Nie mówię o tym, kiedy powiadomienie zostanie kliknięte, a nawet odrzucone. Mam na myśli, że jeśli użytkownik dotknie tylko górnej części paska powiadomień, dźwięk nie jest odtwarzany. Nie widzę sposobu, aby to uchwycić, czy jestem w błędzie? –

11

To powinno wystarczyć.

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

Skąd masz instancję mediaPlayer? – RaphMclee

1

Prostym rozwiązaniem byłoby anulowanie powiadomienia po 30 sekundach i utworzenie nowego.

Można nawet sklonować oryginalne powiadomienie i po prostu usunąć dźwięk dzwonka dla nowego.

+0

jak wykryć, czy powiadomienie zostało już anulowane przez użytkownika, więc nie umieszczam duplikatu powiadomienia po jego kliknięciu? –