В 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;
}
0
user945216 31 Янв 2013 в 05:03
Музыка - это услуга или простой урок? Поскольку вы играете в фоновом режиме, я предполагаю, что это услуга.
 – 
Lazy Ninja
31 Янв 2013 в 05:27
Не могли бы вы опубликовать верхнюю часть имен классов, чтобы мы могли видеть, что вы используете для интерфейсов и надстроек?
 – 
JoxTraex
31 Янв 2013 в 06:15
Да, это простой класс ... Я отредактировал свой код, чтобы показать. Мне придется это изменить, я думаю
 – 
user945216
31 Янв 2013 в 06:24
Следует иметь в виду, что onResume всегда будет вызываться после onCreate, поэтому вам нужно только настроить медиаплеер для воспроизведения в onResume.
 – 
JoxTraex
31 Янв 2013 в 06:31
Да, это правда. Я мог бы просто поставить: else {Music.playBGmusic (this, R.raw.main_music); } в onResume (). Хотя это не объясняет, почему его обрезают.
 – 
user945216
31 Янв 2013 в 06:33

1 ответ

Лучший ответ

Вам действительно следует привязать службу для управления MediaPlayer, а не контролировать ее основное действие. Вместо этого он должен управлять службой через привязку службы к вашему приложению.

Проще говоря (при условии, что вы хотите непрерывно воспроизводить музыку даже после выхода из приложения):

Когда вы проигрываете музыку, вы хотите запустить ее в фоновом режиме, и ваше приложение будет контролировать (запуск / остановка / пауза) состояния вашего медиаплеера. Когда вы создаете медиаплеер, вы играете на заднем, а не на переднем плане. Это позволяет вам непрерывно воспроизводить музыку, пока у пользователя запущена ваша служба.

Связь может быть настроена с помощью PendingIntent для связи с вашей службой путем захвата определенных фильтров намерений. Я бы порекомендовал зайти на сайт разработчиков Google и пройти некоторые из руководств и попытаться узнать, как намерения, фильтр намерений / действия и службы, а также изучить жизненный цикл действий и служб.

Чтобы сделать это правильно, вам следует выделить время на исследования / эксперименты и изучение Android.

0
JoxTraex 31 Янв 2013 в 06:09
Не могли бы вы рассказать подробнее? Например, в чем на самом деле проблема, и как это могло бы ее решить ... Извините, но я новичок в android.
 – 
user945216
31 Янв 2013 в 05:12
На самом деле он не должен продолжать играть музыку, когда приложение закрыто, но я посмотрю на сервис. Что мне нужно сделать, так это то, что при переключении с одного занятия на другое мне нужно будет проигрывать другую музыку. Проблема заключалась в том, что каким-то образом эта музыка прерывалась при вызове playBGmusic () в onResume ()
 – 
user945216
31 Янв 2013 в 06:30
На самом деле этот код - всего лишь фрагмент того, что у меня есть, и оказалось, что проблема в stopBGmusic () и моей логике в onResume (). Я как бы забыл, что сделал ... но я в основном подчистил, и теперь это работает. Спасибо за помощь!
 – 
user945216
31 Янв 2013 в 07:17