2014-10-29 7 views
5

Ich implementiere Notification wie folgt. Der Standardalarm-Sound spielt gut, aber nur einmal. Alles was ich will, ist es wiederholt zu spielen bis der Tap registriert ist.Android Notification Builder: So stellen Sie Soundso ein, dass Sound in einem Looper abgespielt wird

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.ic_launcher) 
        .setContentTitle("I Am Fine") 
        .setStyle(new NotificationCompat.BigTextStyle() 
        .bigText(NOTIFICATION_MESSAGE))  
        .setContentText(NOTIFICATION_MESSAGE) 
        .setAutoCancel(true) 
        .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE); 

      Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
      mBuilder.setSound(alarmSound,AudioManager.STREAM_MUSIC); 

Der zweite Parameter zu setSound zeigt keinen Effekt. Bitte helfen Sie!

Antwort

-2

Sie sollten die Benachrichtigungssounds stummschalten und die Audiodatei einfach mit dem Media Player von Ihrer App abspielen. Setzen Sie die Instanz des Media Players auf loop.

Danach sollten Sie mit Ihrer Benachrichtigung eine ausstehende Intent-Variable hinzufügen. Sobald der Benutzer auf die Benachrichtigung tippt, wird das zugehörige Ereignis ausgelöst und Sie können die Media Player-Instanz von hier aus stoppen.

+0

Ich implementiere das. Hoffe das wird funktionieren. – inderbagga

0

Ich habe dies unter SendNotification Method Body aufgerufen.

try { 

      Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
      PlaySound(this,notification); 

    } catch (Exception e) { 
      e.printStackTrace(); 
     } 

Playsound Definition ist wie folgt:

private void PlaySound(Context context,Uri alert){ 

    try{ 
     mPlayer=new MediaPlayer(); 
     mPlayer.setDataSource(context,alert); 
     final AudioManager am=(AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     if(am.getStreamVolume(AudioManager.STREAM_ALARM)!=0); 
     { 
      mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mPlayer.prepare(); 
      mPlayer.setLooping(true); 
      mPlayer.start(); 
     } 

    }catch(IOException e) 
    { 
    Log.i("AlaramReciever", "no audio file"); 
    } 
} 

den Ton zu stoppen, wenn Benachrichtigung abgegriffen wird, ich das Mediaplayer-Objekt an ein öffentliches statisches Objekt geändert haben, wie unten:

if(GCMNotificationIntentService.mPlayer != null) 
    { 
     try{ 
      GCMNotificationIntentService.mPlayer.stop(); 
      GCMNotificationIntentService.mPlayer.release(); 
     }finally { 
      GCMNotificationIntentService.mPlayer = null; 
     } 
    } 

Die gewünschte Funktionalität ist erreicht, aber ich bekomme immer folgende RunTimeException

Handler android.media.MediaPlayer $ EventHandler, der eine Nachricht an einen Handler in einem toten Thread sendet, während onDestroy sofort aufgerufen wird. Gibt es einen Weg dies zu verhindern?

10

Sie müssen FLAG_INSISTENT für die Benachrichtigung verwenden. Von der documentation: -

public static final int FLAG_INSISTENT

Bit in den Flags-Feld bitweise verodert werden, dass die Audio-falls eingestellt, wird wiederholt, bis die Meldung gelöscht wird oder das Benachrichtigungsfenster ist geöffnet.

Konstante Wert: 4 (0x00000004)

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    Uri soundUri = RingtoneManager 
      .getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      getApplicationContext()).setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle("title").setContentText("message") 
      .setSound(soundUri); // This sets the sound to play 

    Notification mNotification = mBuilder.build(); 

    mNotification.flags |= Notification.FLAG_INSISTENT; 

    // Display notification 
    notificationManager.notify(1, mNotification); 
0
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)); 
MediaPlayer player = MediaPlayer.create(this, notification); 
player.setAudioStreamType(AudioManager.STREAM_ALARM); 
player.setLooping(true); 
player.start(); 

player.setLooping(true); dieses Sie Media-Player erlauben, Ton wiederholt zu spielen. auf onclick() der Taste verwenden player.stop();, um den Ton zu stoppen

+0

Bitte erklären Sie, wie dieser Code das Problem löst. Andernfalls besteht die Gefahr, dass Sie abgelehnt werden und/oder gelöscht werden. – Mangesh

+0

player.setLooping (wahr); Auf diese Weise können Sie den Media Player wiederholt abspielen lassen. bei onclick der Taste benutze player.stop(); um den Ton zu stoppen –