Воспроизведение музыки BG на разных мероприятиях в Android - PullRequest
31 голосов
/ 20 января 2010

Hello! Первый раз, чтобы задать вопрос здесь, в stackoverflow. Захватывающе! Ха-ха.

Мы разрабатываем игру для Android и играем некоторую фоновую музыку для нашего вступления (у нас есть вступительное задание), но мы хотим, чтобы оно продолжало воспроизводиться до следующего занятия и, возможно, было бы в состоянии остановить или воспроизвести музыку снова в любом месте приложения.

В данный момент мы играем на фоновом режиме, используя MediaPlayer в нашей вступительной части. Однако мы останавливаем музыку, как только пользователь покидает эту активность. Должны ли мы использовать что-то вроде Сервисов для этого? Или MediaPlayer / SoundPool достаточно? Если кто-нибудь знает ответ, мы будем рады, если вы поделитесь им с нами. Спасибо!

Ответы [ 5 ]

9 голосов
/ 12 июня 2010

Вы также можете создать сервис для воспроизведения музыки с помощью медиаплеера, как показано ниже.

Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc); //OR stopService(svc); 

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();


        player = MediaPlayer.create(this, R.raw.idil);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);

    }
    public int onStartCommand(Intent intent, int flags, int startId) {


        player.start();

        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TODO



    }
    public IBinder onUnBind(Intent arg0) {
        // TODO Auto-generated method stub

        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {

        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}
5 голосов
/ 17 июня 2010

Создание статического SoundManager с использованием SoundPools или MediaPlayers.

Создайте статический флаг с именем keepMusicGoing.

Запустите музыку, когда будет создан первый актив.

При переключении активностей установите keepMusicGoing в true.

В событии onStop вашей деятельности проверьте, является ли keepMusicGoing истинным, если это так, оставьте музыку включенной, затем установите keepMusicGoing в false.

Если они нажмут кнопку «Домой», флаг keepMusicGoing станет ложным, поэтому музыка остановится, когда активность потеряет фокус.

Напишите мне, и я могу отправить вам пару SoundManager, которые я написал, один использует MediaPlayers, а другой SoundPools

Чад

2 голосов
/ 10 июня 2010

Если я правильно понимаю вашу ситуацию, то я сталкивался с той же проблемой несколько раз.Я использую другую ветку для воспроизведения музыки в своих приложениях.Эта реализация передает статическую ссылку на Контекст, который, как я знаю, будет живым в течение времени, когда музыка будет воспроизводиться.

public class AudioPlayer extends Thread {
private Context c;
private Thread blinker;
private File file;

public AudioPlayer (Context c, File file) {
    this.c = c;
    this.file = file;
}

public void go () {
    blinker = this;
    if(!blinker.isAlive()) {
        blinker.start();
    }
}

public void end () {
    Thread waiter = blinker;
    blinker = null;
    if (waiter != null)
        waiter.interrupt ();
}

public void run () {
    MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file));
    int duration = ap.getDuration();
    long startTime = System.currentTimeMillis();
    ap.start();
    try {
        Thread thisThread = Thread.currentThread();
        while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) {           
            Thread.sleep (500);  // interval between checks (in ms)
        }
        ap.stop ();
        ap.release ();
        ap = null;
    } catch (InterruptedException e) {
        Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION");
        ap.stop ();
        ap.release();
        ap = null;
    }
    }
}
1 голос
/ 20 июля 2015

Сначала я использовал метод, чтобы сохранить флаг keepMusicPlaying, предоставленный Чадом. Я думаю, что более элегантно просто использовать методы onStart и onStop вашей деятельности.

Создайте собственный класс "SoundManager" и вызовите в нем некоторые классы onStart и onStop из всех ваших действий onStart и onStop (или используйте базовый класс действий). Отслеживайте onStart и onStop с помощью startCounter (startCounter ++ в onstart и startCounter-- в onstop). Поскольку начало нового действия вызывается перед onStop старого действия, вы всегда знаете, вызывается ли onStart в первый раз (startCounter == 1) или началось с другого из ваших действий (startCounter == 2). То же самое с onStope (startCounter == 0 означает, что приложение было закрыто, startCounter == 1 означает, что это просто остановка от старого действия, но есть новое).

Таким образом, вы инкапсулируете все в SoundManager вместо того, чтобы вызывать какой-либо метод / флаг keepMusicPlaying при каждом запуске действия в вашем приложении.

    public void OnStart()
    {
        startCounter++;
        if (startCounter == 1)
        {
            //start music here
        }

    public void OnStop()
    {
        startCounter--;
        if (startCounter == 0)
        {
            // stop music here
        }
    }
1 голос
/ 11 июня 2010

Вы можете попробовать использовать AsyncPlayer , но вы должны сохранить ссылку на класс, чтобы звук не воспроизводился.

Вы можете создать Uri для локального ресурса, используя Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/ beep.mp3");.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...