В MainActivity я проигрываю фоновую музыку с помощью MediaPlayer.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Music.playBGmusic(this, R.raw.main_music);
}
@Override
protected void onResume() {
super.onResume();
if ( ! Music.isPlaying(this) )
{
Music.playBGmusic(this, R.raw.main_music);
}
}
В Music.java:
public class Music {
private static MediaPlayer mMainSound = null;
public static boolean isPlaying(Context context)
{
if ( mMainSound != null )
{
return mMainSound.isPlaying();
}
return false;
}
public static void playBGmusic(Context context, int resource)
{
if ( mMainSound != null ) mMainSound.release();
mMainSound = MediaPlayer.create(context, resource);
mMainSound.setLooping(true);
mMainSound.start();
}
public static void stopBGmusic(Context context) {
if (mMainSound != null) {
mMainSound.stop();
mMainSound.release();
mMainSound = null;
}
}
}
Где mMainSound
- объект MediaPlayer. В моей MainActivity есть кнопка, и при нажатии на нее создается намерение и startActivity
это намерение. Это новое действие вызывает playBGmusic
другим звуком . Теперь, когда это новое действие вызывает stopBGmusic()
и finish()
для возврата в MainActivity, onResume()
MainActivity вызывается, как и ожидалось, и он должен воспроизводить main_music
в фоновом режиме. На самом деле происходит то, что я слышу музыку меньше секунды, и она обрывается. Я пробовал использовать prepare()
перед запуском MediaPlayer, но это не решило проблему. Буду очень признателен, если кто-нибудь сможет прояснить мне этот вопрос.
Может быть, мне также стоит упомянуть, где в новом действии вызывается finish()
, хотя я не уверен, имеет ли это какое-то значение ..
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch(keyCode)
{
case KeyEvent.KEYCODE_BACK:
showDialog(1);
break;
}
return true;
}
@Override
protected Dialog onCreateDialog(int id) { //id is ignored
Dialog dialog = null;
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.return_home)
.setCancelable(true)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.setNegativeButton(R.string.cancel, null);
dialog = builder.create();
return dialog;
}
1 ответ
Вам действительно следует привязать службу для управления MediaPlayer, а не контролировать ее основное действие. Вместо этого он должен управлять службой через привязку службы к вашему приложению.
Проще говоря (при условии, что вы хотите непрерывно воспроизводить музыку даже после выхода из приложения):
Когда вы проигрываете музыку, вы хотите запустить ее в фоновом режиме, и ваше приложение будет контролировать (запуск / остановка / пауза) состояния вашего медиаплеера. Когда вы создаете медиаплеер, вы играете на заднем, а не на переднем плане. Это позволяет вам непрерывно воспроизводить музыку, пока у пользователя запущена ваша служба.
Связь может быть настроена с помощью PendingIntent для связи с вашей службой путем захвата определенных фильтров намерений. Я бы порекомендовал зайти на сайт разработчиков Google и пройти некоторые из руководств и попытаться узнать, как намерения, фильтр намерений / действия и службы, а также изучить жизненный цикл действий и служб.
Чтобы сделать это правильно, вам следует выделить время на исследования / эксперименты и изучение Android.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.