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

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

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

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

Solutions Collecting From Web of "Воспроизведение музыки BG через работу в Android"

По моему опыту использования Сервисов это не очень хорошая идея.

Фоновая музыка без использования служб:

http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

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

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

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

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

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

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

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

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

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

Чад

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

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

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

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

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

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

Моя библиотека была разработана для того, чтобы сделать фоновое воспроизведение мультимедиа максимально простым. Попробуйте взглянуть на источник или просто используйте библиотеку, если хотите.