Intereting Posts
Андроид «заткнись», что именно происходит с памятью Какие события могут просыпаться спящим Android-устройством? Обновление LinearLayout после добавления представления Приемник широковещательной передачи занимает слишком много времени для приема в onReceive () после того, как режим самолета выключен / включен Android не может расширить службу сообщений Firebase Обработка и сглаживание IllegalStateException («состояние сохранения сбрасывания: активный $ Фрагмент очистил индекс: -1») Данные многостраничной формы POST с использованием Retrofit 2.0, включая изображение Конфигурации Gradle не работают, как ожидается в новой системе Android Android Как создать обратные вызовы между кодом Android и собственным кодом? Как играть в raw h264, созданный кодировщиком MediaCodec? Как сместить изображение с помощью пальца в Android? Включение / выключение прослушивателя меню переадресации InitializeScrollbars не определено? IllegalStateException в MediaPlayer Facebook NativeAdsManager исключает из памяти исключение в RecyclerView

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

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

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

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

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

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

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

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