2017-04-18 2 views
0

Je suis coincé avec ce dernier bout de code. Je souhaite qu'une alarme soit lue lorsqu'un bouton est enfoncé. L'alarme joue sur MUSIC_STREAM, car elle doit être lue par le biais des écouteurs/oreillettes uniquement afin que personne d'autre ne soit dérangé.Comment arrêter toute musique en arrière-plan avec Android (Java)?

public void playAlarm(){ 
try { 
     Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
     mMediaPlayer = new MediaPlayer(); 
     mMediaPlayer.setDataSource(this, alert); 
     final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     originalVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     audioManager.setSpeakerphoneOn(false); 
     audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, alarmVolume, 0); 

     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mMediaPlayer.setLooping(true); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
     mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
               @Override 
               public void onCompletion(MediaPlayer mp) { 
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0); 
               } 
              }); 
    } catch(Exception e) { 
    } 
} 

^Ce code s'exécute lorsque l'alarme est déclenchée. Fonctionne comme un charme. Lit le son de l'alarme par défaut et répète. Quand je tue l'application, le son s'arrête - comme je le veux.

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); 
} 

^Cela fonctionne aussi.

La partie qui ne fonctionne pas est ceci:

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); 
} 

^Il fait une pause musique de PowerAmp ou Player.fm (et d'autres musicplayers), et que mon jeu d'alarme, mais il redémarre aussi chanson sur mon application musicale par défaut (PowerAmp) - le volume est très faible, mais à la fois mon alarme et la chanson est portable. Lorsque je lis de la musique avec Player.fm, le lecteur interrompt également la lecture, l'alarme est lue, mais une fois de plus, l'application musicale par défaut démarre.

J'ai essayé des recherches sur le web et tous ces 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); 
} 

^ne fonctionne pas

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); 
    } 
} 

^ne fonctionne pas

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 

} 

^ne fonctionne pas

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); 
} 

^ne fonctionne pas

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); 
} 

^Et, étonnamment, ne fonctionne pas.

+0

_ "Quand je tue l'application" _ Pourquoi fais-tu ça? Arrêter le 'MediaPlayer' (et éventuellement terminer l'activité en cours) semble plus approprié. En ce qui concerne votre question de lecture, la méthode normale consiste à demander temporairement une mise au point audio pour votre application. – Michael

+0

@Michael pourrait être une meilleure idée. Merci pour votre contribution. –

Répondre

0

Utilisez le code suivant:

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

Fonctionne comme un charme! Merci! –