2017-10-19 13 views
0

J'essaie de jouer de la musique avec un service d'arrière-plan. Tout d'abord, j'ai un toggle button dans MainActivity pour jouer et arrêtant la musique, je crée BackgroundSoundService juste pour jouer de la musique dans toutes les activités de ne pas jouer en arrière-plan:jouer de la musique avec le service de fond

public class BackgroundSoundService extends Service { 

private static final String TAG = "BackgroundSoundService"; 
MediaPlayer player; 

public IBinder onBind(Intent arg0) { 
    Log.i(TAG, "onBind()"); 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    player = MediaPlayer.create(this, R.raw.vaporv2); 
    player.setLooping(true); // Set looping 
    player.setVolume(100,100); 
    Log.i(TAG, "onCreate() , service started..."); 

} 
public int onStartCommand(Intent intent, int flags, int startId) { 
    player.start(); 
    return Service.START_STICKY; 
} 

public IBinder onUnBind(Intent arg0) { 
    Log.i(TAG, "onUnBind()"); 
    return null; 
} 
public void onStop() { 
    Log.i(TAG, "onStop()"); 
} 
public void onPause() { 
    if(player!=null && player.isPlaying()){ 
     player.pause(); 
    } 
    Log.i(TAG, "onPause()"); 
} 
@Override 
public void onDestroy() { 
    player.stop(); 
    player.release(); 
    Log.i(TAG, "onCreate() , service stopped..."); 
} 

@Override 
public void onLowMemory() { 
    Log.i(TAG, "onLowMemory()"); 
} 
    } 

et MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    MusicButton = (ToggleButton) findViewById(R.id.toggleButton); 

    MusicButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (MusicButton.isChecked()) { 
       //mediaPlayer.pause(); 
       Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class); 
       startService(myService); 
      } else { 
       //mediaPlayer.start(); 
       Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class); 
       stopService(myService); 
      } 
     } 
    }); 

Mon problème se produit lorsque je mets la musique en pause et la rejoue. La musique commence depuis le début quand je veux qu'elle continue là où elle s'est arrêtée. Mon deuxième problème est que je ne veux pas jouer de la musique en arrière-plan, je veux arrêter la musique lorsque l'application est en arrière-plan, s'il vous plaît toute aide.

+0

Consultez ce [lien] (https://stackoverflow.com/questions/27685889/how-to-stop-service-of-music-background) pour arrêter la musique en arrière-plan. – Thracian

Répondre

3

Je ne sais pas ce que votre onPause() et onStop() sont destinés à faire. Toutefois, lorsque vous démarrez un service pour la première fois en utilisant Context.startService(), la méthode onCreate() du service est appelée, puis onStartCommand() est appelée et plus tard lorsque vous appelez startService() à nouveau, seul le onStartCommand() est appelé. Donc, pour une raison quelconque, si vous voulez jouer le son dans un service et mettre en pause que dans le même service, vous devez fournir un service Action qui spécifie l'action que vous voulez faire.

Donc, dans votre activité lorsque vous voulez dire au service de jouer le son:

String action = "PLAY"; 
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class); 
myService.setAction(action); 
startService(myService); 

et pour mettre en pause le son:

String action = "PAUSE"; 
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class); 
myService.setAction(action); 
startService(myService); 

et dans la méthode onStartCommand() à votre service:

if (intent.getAction().equals("PLAY")) { 
    // resume the sound 
} 
if (intent.getAction().equals("PAUSE")) { 
    // pause the sound 
} 

et quand vous avez vraiment besoin d'arrêter le service signifiant Destroy le service, appelez context.stopService() et seulement alors onDestroy() méthode est appelée et le service est vraiment détruit.

+0

merci beaucoup c'est du travail mais la musique joue encore en arrière-plan j'ai mis ce code 'Intent myService = new Intent (MainActivity.this, BackgroundSoundService.class); getApplicationContext(). StartService (myService); 'dans mon' onDestroy() 'en activité –

+0

s'il vous plaît la musique joue toujours en arrière-plan –

+1

@ S.Queroane Je ne sais pas exactement quel est votre problème. Voulez-vous que la musique soit arrêtée lorsque votre service est détruit? – szamani20

0

Pour éviter de jouer en remplacement de fond sur la pause d'activité vous y services pause et reprendre là où vous avez quitté d'enregistrer la position actuelle dans une préférence puis le récupérer en cas de besoin