Воспроизведение музыки BG в различных видах деятельности на Android
Здравствуйте! Первый раз, чтобы задать вопрос здесь, в stackru. Захватывающе! Ха - ха.
Мы разрабатываем игру для Android и играем некоторую фоновую музыку для нашего вступления (у нас есть вступительное мероприятие), но мы хотим, чтобы оно продолжало играть до следующего занятия и, возможно, могло бы снова остановить или воспроизвести музыку из любой точки приложение.
На данный момент мы играем в фоновую музыку, используя MediaPlayer, в нашей вступительной части. Однако мы останавливаем музыку, как только пользователь покидает эту активность. Должны ли мы использовать что-то вроде Сервисов для этого? Или MediaPlayer/SoundPool достаточно? Если кто-нибудь знает ответ, мы будем рады, если вы поделитесь им с нами. Спасибо!
5 ответов
По моему опыту использования Сервисов для этого не очень хорошая идея.
Фоновая музыка без использования Сервисов:
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.
Запустите музыку, когда будет создан первый актив.
При переключении активностей установите keepMusicGoing в true.
В событии onStop ваших действий проверьте, имеет ли keepMusicGoing значение true, если это так, оставьте музыку включенной, затем установите для keepMusicGoing значение false.
Если они нажимают кнопку "Домой", флаг keepMusicGoing будет иметь значение false, поэтому музыка остановится, когда активность потеряет фокус.
Напишите мне, и я могу отправить вам пару SoundManager, которые я написал, один использует 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;
}
}
}
Сначала я использовал метод хранения флага 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
}
}
Вы можете попробовать использовать AsyncPlayer, но вы должны сохранить ссылку на класс, чтобы остановить воспроизведение звука.
Вы можете создать Uri для локального ресурса, используя Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/
beep.mp3");
,
Надеюсь это поможет.
Моя библиотека была разработана, чтобы сделать фоновое воспроизведение мультимедиа максимально простым. Попробуйте посмотреть на источник, или просто используйте библиотеку, если хотите.
Объединив ответы Чада и Кеду и добавив свой собственный вкус, я создал это рабочее решение:
// Parent Activity which every Activity extends
public class ParentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
Music.onStart();
}
@Override
protected void onStop() {
super.onStop();
Music.onStop();
}
}
// Controller class for handling background music
public abstract class Music {
private static MediaPlayer mediaPlayer;
private static int startCounter = 0;
public static void onStart() {
startCounter++;
if (startCounter == 1) {
mediaPlayer = MediaPlayer.create(InitializeActivity.getContext(), R.raw.background_music);
mediaPlayer.setLooping(true);
mediaPlayer.setVolume(1f, 1f);
mediaPlayer.start();
}
}
public static void onStop() {
startCounter--;
if (startCounter == 0) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
И все, супер просто!