Как сделать включение и выключение фоновой музыки в мобильной игре (или приложении)?
Пишу мобильную игру
Есть класс, через который реализуется включение музыки в фоновом режиме:
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service {
private static final String TAG = "MyService";
static MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
player = MediaPlayer.create(this, R.raw.sound);
player.setLooping(true); // зацикливаем
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
player.stop();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
player.start();
}
}
В активности обращение к этому классу и вызов класса, унаследованного от View (об этом ниже) происходит следующим образом:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
GameView gameView = new GameView(this); // создаём gameView
LinearLayout gameLayout = (LinearLayout) findViewById(R.id.gameLayout); // находим gameLayout
gameLayout.addView(gameView); // и добавляем в него gameView
...
startService(new Intent(this, MyService.class)); // обращение к классу MyService
}
Весь игровой процесс происходит в классе, унаследованном от View (это важно). Этот класс также запускается из активности. Включение и выключение музыки в этом классе реализовано так:
if (soundOn){
soundOn = false;
MyService.player.stop(); // выключение музыки
}
else {
soundOn = true;
MyService.player.start();
И выключается музыка вполне успешно, а вот включить её обратно уже не получается. Подскажите, пожалуйста, что как это исправить.
P.S. Не обязательно использовать приведённый мной код, главное, чтобы музыка играла на фоне игрового процесса и её можно было бы включить и выключить.
Ответы (1 шт):
Не хотел я это выкладывать из-за "некрасивых" статических объектов, но раз автор вопроса попросил, а на практике все работает отлично в нескольких проектах, то пожалуйста.
public class GameSound {
static SoundPool sp;
static int drop_on_field;
static int drop_on_screen;
static int take;
static int complete;
static MediaPlayer media_player;
static void Init( Context context){
sp = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
drop_on_field = sp.load(context, R.raw.drop_on_field, 1);
take = sp.load(context, R.raw.take, 1);
drop_on_screen = sp.load(context, R.raw.drop_on_screen, 1);
complete = sp.load(context, R.raw.complete, 1);
media_player = MediaPlayer.create(context, R.raw.music);
media_player.setLooping(true);
}
static void PlaySound( int id){
if( Options.sound ){
sp.play( id, 1, 1, 0, 0, 1);
}
}
static void onResume(){
if( GameSound.media_player != null && Options.music){
GameSound.media_player.start();
}
}
static void onPause(){
if( GameSound.media_player != null && GameSound.media_player.isPlaying()){
GameSound.media_player.pause();
}
}
}
Далее, во всех активностях игры, где будет звучать фоновая музыка добавляем:
@Override
protected void onResume(){
super.onResume();
GameSound.onResume();
}
@Override
protected void onPause(){
super.onPause();
GameSound.onPause();
}