Здравствуйте! В первый раз, который задаст вопрос здесь в stackoverflow. Возбуждение! Ха-ха.
Мы разрабатываем игру Android, и мы играем некоторую фоновую музыку для нашего введения (у нас есть Вводное Действие), но мы хотим, чтобы это продолжило подыграло следующему Действию и возможно могло остановить или играть музыку снова отовсюду в рамках приложения.
Что мы делаем, в данный момент игра bgm использование MediaPlayer при нашем Вводном Действии. Однако мы останавливаем музыку, как только пользователь оставляет то Действие. Мы должны использовать что-то как Сервисы для этого? Или MediaPlayer/SoundPool достаточно? Если бы кто-либо знает ответ, мы с удовольствием ценили бы Ваше совместное использование его с нами.Спасибо!
Если я правильно понимаю вашу ситуацию, то я несколько раз сталкивался с той же проблемой. Я использую другой поток для воспроизведения музыки в своих приложениях. Эта реализация передает статическую ссылку на Context, который, как я знаю, будет активен в то время, когда будет играть музыка.
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 ");
.
Надеюсь, это поможет.
Вы также можете создать службу, которая воспроизводит музыку с помощью медиаплеера, как показано ниже.
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, если да, оставьте музыку включенной, а затем установите для keepMusicGoing значение false.
Если они нажмут кнопку «Домой», флаг keepMusicGoing будет ложным, поэтому воспроизведение музыки прекратится, когда активность потеряет фокус.
Напишите мне, и я могу отправить вам пару менеджеров звука, которые я написал, один использует MediaPlayers, а другой - SoundPools
Чад