Подтвердить что ты не робот

Воспроизведение музыки BG через действия в Android

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

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

То, что мы делаем в данный момент, - это играть в bgm с помощью MediaPlayer в нашей Intro Activity. Однако мы останавливаем музыку, как только пользователь покидает эту активность. Нужно ли для этого использовать что-то вроде Сервисов? Или достаточно MediaPlayer/SoundPool? Если кто-нибудь знает ответ, мы с радостью оценим, как вы делитесь им с нами. Спасибо!

4b9b3361

Ответ 2

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

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() {

    }
}

Ответ 3

Создайте статический SoundManager с помощью SoundPools или MediaPlayers.

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

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

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

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

Если они нажимают кнопку home, флаг keepMusicGoing будет ложным, поэтому музыка остановится, когда активность потеряет фокус.

Отправьте мне электронное письмо, и я могу отправить вам пару SoundManagers, которые я написал, использует MediaPlayers и другие SoundPools

Чад

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Сначала я использовал метод, в котором сохранить флаг "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/flag при каждом запуске деятельности внутри вашего приложения.

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

    public void OnStop()
    {
        startCounter--;
        if (startCounter == 0)
        {
            // stop music here
        }
    }