2017-04-18 2 views
0

Ich bin mit diesem letzten Stück Code fest. Ich möchte einen Alarm spielen, wenn eine Taste gedrückt wird. Der Alarm wird über den MUSIC_STREAM abgespielt, da er nur über Kopfhörer/Ohrhörer wiedergegeben werden muss, damit niemand gestört wird.Wie alle Musik im Hintergrund mit Android (Java) zu stoppen?

^Dieser Codecode wird ausgeführt, wenn der Alarm ausgelöst wird. Klappt wunderbar. Spielt den voreingestellten Alarmton ab und wiederholt. Wenn ich die App kill, hört der Ton auf - wie ich will.

public void killApp(){ 
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.cancelAll(); 
finish(); 

    moveTaskToBack(true); 
    android.os.Process.killProcess(android.os.Process.myPid()); 
    System.exit(1); 
} 

^Das funktioniert auch.

Der Teil, der nicht ist dies funktioniert:

private static void sendMediaButton(Context context, int keyCode) { 
    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); 
    Intent intentPause = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    intentPause.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); 
    context.sendOrderedBroadcast(intentPause, null); 

    keyEvent = new KeyEvent(KeyEvent.ACTION_UP, keyCode); 
    intentPause = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    intentPause.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); 
    context.sendOrderedBroadcast(intentPause, null); 
} 

^Es Pausen Musik von PowerAmp oder Player.fm (und anderem musicplayers), und meinen Alarm zu spielen, aber es startet auch eine Song auf meiner Standard-Musik-App (PowerAmp) - die Lautstärke ist sehr niedrig, aber sowohl mein Wecker und das Lied ist hörbar.

Wenn ich mit Player.fm Musik abspiele, pausiert der Player auch, der Alarm wird abgespielt, aber wieder startet meine Standard-Musik-App.

Ich habe versucht, Suchanfragen im Web und all diese Codes:

private static void sendMediaButton2(final Context context, int keyCode){ 
    Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
    mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
    context.sendBroadcast(mediaEvent); 

    new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
      KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
      mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
      context.sendBroadcast(mediaEvent); 
     } 
    }, 100); 
} 

^Nicht

public void stopMusicPlaying5(){ 
    AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    String SERVICECMD = "com.android.music.musicservicecommand"; 
    String CMDNAME = "command"; 
    String CMDSTOP = "stop"; 

    if(mAudioManager.isMusicActive()) { 
     Intent i = new Intent(SERVICECMD); 
     i.putExtra(CMDNAME , CMDSTOP); 
     MapsActivity.this.sendBroadcast(i); 
    } 
} 

arbeiten nicht

Arbeits^
public void stopMusicPlaying(){ 
    KeyEvent ke = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE); 
    Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); 

    // construct a PendingIntent for the media button and unregister it 
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    //PendingIntent pi = PendingIntent.getBroadcast(AppContext.getContext(), 
    //  0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); 
    intent.putExtra(Intent.EXTRA_KEY_EVENT, ke); 
    //sendKeyEvent(pi, AppContext.getContext(), intent); 

    ke = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE); 
    intent.putExtra(Intent.EXTRA_KEY_EVENT, ke); 
    //sendKeyEvent(pi, AppContext.getContext(), intent); 

    //  android.intent.action.MEDIA_BUTTON 

} 

^Nicht

Arbeits
public void stopMusicPlaying1(){ 
    long eventtime = SystemClock.uptimeMillis(); 

    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0); 
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent); 
    sendOrderedBroadcast(downIntent, null); 
} 

^arbeiten nicht

public void stopMusicPlaying4(){ 
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

    if (audioManager != null){ 
     audioManager = (AudioManager)getSystemService(AUDIO_SERVICE); 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE); 
     audioManager.dispatchMediaKeyEvent(event); 
    } 
} 

public void stopMusicPlaying2(){ 
    long eventtime = SystemClock.uptimeMillis(); 

    Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 
    KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_STOP, 0); 
    upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent); 
    sendOrderedBroadcast(upIntent, null); 
} 

^Und überraschenderweise nicht funktioniert.

+0

_ "Wenn ich die app töten" _ Warum tun Sie das? Den MediaPlayer anzuhalten (und vielleicht die aktuelle Aktivität zu beenden) scheint angemessener zu sein. Was Ihre Frage zur Wiedergabe angeht, besteht der normale Weg darin, vorübergehend den Audiofokus für Ihre App anzufordern. – Michael

+0

@Michael könnte eine bessere Idee sein. Danke für deinen Beitrag. –

Antwort

0

Verwenden folgenden Code:

AudioManager.OnAudioFocusChangeListener focusChangeListener = 
      new AudioManager.OnAudioFocusChangeListener() { 
       public void onAudioFocusChange(int focusChange) { 
        AudioManager am = (AudioManager) 
getSystemService(AUDIO_SERVICE); 
        switch (focusChange) { 

         case 
(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK): 
          // Lower the volume while ducking. 
          player.setVolume(0.2f, 0.2f); 
          break; 
         case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT): 
          player.pause(); 
          break; 

         case (AudioManager.AUDIOFOCUS_LOSS): 
          player.stop(); 
          break; 

         case (AudioManager.AUDIOFOCUS_GAIN): 

          player.setVolume(1f, 1f); 

          break; 
         default: 
          break; 
        } 
       } 
      }; 

    AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE); 

// Request audio focus for playback 
    int result = am.requestAudioFocus(focusChangeListener, 
// Use the music stream. 
      AudioManager.STREAM_MUSIC, 
// Request permanent focus. 
      AudioManager.AUDIOFOCUS_GAIN); 


    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
     player.setSource(video); 

    } 
+0

Funktioniert wie ein Charme! Vielen Dank! –

Verwandte Themen