2017-07-18 2 views
0

Je crée une application nécessitant un service d'arrière-plan sur Android Wear. J'ai réussi à le faire fonctionner en arrière-plan. Aller à une application différente ou en cliquant sur le bouton d'accueil n'arrête pas le service, mais en balayant à droite sur le MainActivity arrête l'application et l'activité. C'est la manière évidente de revenir au cadran, donc je ne veux pas désactiver le balayage. Y a-t-il un moyen de contourner cette action?Méthode de remplacement pour glisser l'application d'usure

Éditer: Voici mon code. J'ai ajouté START_STICKY comme suggéré mais je n'ai pas vu de différence.

public class MusicService extends Service implements MediaPlayer.OnPreparedListener, 
MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, 
AudioManager.OnAudioFocusChangeListener { 

private MediaPlayer player; 
private List<Song> songs; 
private int songIndex; 
private final IBinder musicBind = new MusicBinder(); 
private AudioManager audioManager; 

public void onCreate() { 
    // Create the service 
    super.onCreate(); 
    songIndex = 0; 
    player = new MediaPlayer(); 

    initMusicPlayer(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    String mediaFile = ""; 
    try { 
     //An audio file is passed to the service through putExtra(); 
     mediaFile = songs.get(songIndex).uri; 
    } catch (NullPointerException e) { 
     stopSelf(); 
    } 

    //Request audio focus 
    if (requestAudioFocus() == false) { 
     //Could not gain focus 
     stopSelf(); 
    } 

    if (mediaFile != null && mediaFile != "") 
     initMusicPlayer(); 
    return super.onStartCommand(intent, flags, START_STICKY); 
} 

public void initMusicPlayer() { 
    // Set player properties 
    player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    player.setOnPreparedListener(this); 
    player.setOnCompletionListener(this); 
    player.setOnErrorListener(this); 
} 
public void setSong(int songIndex) { 
    this.songIndex = songIndex; 
} 

public void setList(List<Song> songs) { 
    this.songs = songs; 
} 

public class MusicBinder extends Binder { 
    MusicService getService() { 
     return MusicService.this; 
    } 
} 

@Override 
public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) { 
    return false; 
} 

@Override 
public void onAudioFocusChange(int focusState) { 
    switch (focusState) { 
     case AudioManager.AUDIOFOCUS_GAIN: 
      // resume playback 
      if (player == null) initMusicPlayer(); 
      else if (!player.isPlaying()) player.start(); 
      player.setVolume(1.0f, 1.0f); 
      break; 
     case AudioManager.AUDIOFOCUS_LOSS: 
      // Lost focus for an unbounded amount of time: stop playback and release media player 
      if (player.isPlaying()) player.stop(); 
      player.release(); 
      player = null; 
      break; 
     case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
      // Lost focus for a short time, but we have to stop 
      // playback. We don't release the media player because playback 
      // is likely to resume 
      if (player.isPlaying()) player.pause(); 
      break; 
     case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
      // Lost focus for a short time, but it's ok to keep playing 
      // at an attenuated level 
      if (player.isPlaying()) player.setVolume(0.1f, 0.1f); 
      break; 
    } 
} 

private boolean requestAudioFocus() { 
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 
    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
     //Focus gained 
     return true; 
    } 
    //Could not gain focus 
    return false; 
} 

private boolean removeAudioFocus() { 
    return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == 
      audioManager.abandonAudioFocus(this); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return musicBind; 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    player.stop(); 
    player.release(); 
    return false; 
} 

@Override 
public void onCompletion(MediaPlayer mediaPlayer) { 

} 



@Override 
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { 
    return false; 
} 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    mediaPlayer.start(); 
} 

public void playSong() { 
    player.reset(); 
    Song playSong = songs.get(songIndex); 
    Uri trackUri = Uri.parse(playSong.uri); 

    try { 
     player.setDataSource(getApplicationContext(), trackUri); 
     player.prepareAsync(); 
    } catch (Exception ex) { 
     Log.e("Music Service", "Error setting data source", ex); 
    } 
} 
} 
+0

peut-être que vous pourriez rendre votre service START_STICKY dans son onStartCommand(), afin que le système d'exploitation redémarre le service. – ZeekHuge

+0

Je l'ai essayé avec START_STICKY mais je n'ai pas vu de différence. Peut-être qu'il y a quelque chose dans mon code qui me manque. J'utilise aussi 'unbindService (musicConnection);' 'onDestroy' dans l'activité principale, mais supprimer cela lance simplement et error" mediaplayer s'en va avec des événements non gérés " –

+0

Si vous utilisez l'intention d'envoyer des données, essayez d'utiliser' START_REDELIVER_INTENT' – ZeekHuge

Répondre

0

Fondamentalement, je devais ajouter une fonction pour demander la mise au point audio avant de jouer de la musique. Pour toute personne intéressée, je suivais ce tutoriel: https://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/ Puis dans la fonction onDestroy du service, laissez la ligne removeAudioFocus pour laisser la musique continuer.

Éditer: une meilleure façon semble être de suivre le tutoriel, mais dans la méthode onDestroy de l'activité principale, seulement déconnecter le service. Ma méthode précédente fonctionnerait, mais se bloquerait sur certains appareils.