Android backround music через несколько видов деятельности; как поймать нажатие кнопки Home


Я искал в течение нескольких дней по этому вопросу, и хотя он был поднят снова и снова здесь, на SO и в других местах, я не нашел ни одного правильного решения.

Я хочу воспроизвести аудиофайл в фоновом режиме моего приложения. Достаточно просто. Я хочу, чтобы музыка сохранялась, а не останавливалась или приостанавливалась при переключении между действиями в моем приложении. Также довольно легко и просто сделать это в методе onCreate:

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
      mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
      mp.setLooping(true);
      mp.start();
    }

В чем проблема? Заставить музыку звучать остановитесь, когда я нажму кнопку "Домой".

Убить звук, когда пользователь нажимает кнопку назад, кажется легким. Вот что у меня есть для этого и отлично работает:

    public void onPause() {

      if(this.isFinishing()){  //BACK was pressed from this activity
        mp.stop();
      }

    super.onPause(); }

Довольно просто, верно? Да. Несложный. Но это не ловит нажатия кнопки HOME. Если нажать кнопку "Домой", музыка будет продолжать играть, даже если пользователь больше не видит мое приложение. За долгие часы поисков я так и не смог найти простого решения этой проблемы.

Я видел ответы, которые включают установку разрешения в манифесте для получения задач, которые я не должен делать и которые кажутся опасными для пользователей. Кроме того, решение даже не сработало. Я видел решения, которые предполагают использование сервиса, но ни одно из них не работает, потому что кнопка home все еще воспроизводит музыку, как и раньше, потому что, похоже, нет способа поймать ее, и она не "заканчивает" приложение (не говоря уже о том, что каждый раз, когда кто-то предлагает использовать сервис для этой задачи, несколько человек войдите и заявите, что это не является надлежащим использованием для услуг)

Кажется, что единственный способ убить музыку, когда кнопка Home нажата, - это использовать не обусловленную остановку() в onPause, но это не годится, потому что это называется, когда я меняю действия с намерениями, заставляя музыку заканчиваться между действиями, которые не годятся.

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

Каким образом все остальные приложения в Google play store достигают этого, и все же, кажется, нет четкого ответа в интернете? Я имею в виду, что я мог бы просто остановить и начать музыку с каждой onPause (), но это вызвало бы непрофессиональные пробелы в аудио, не говоря уже о том, что это будет начинать фоновое аудио с самого начала снова и снова, что недопустимо.

Просто должно быть что-то, что я упускаю из виду. Заранее всем спасибо за помощь.
2 4

2 ответа:

Я немного новичок в программировании на Android (несколько месяцев), и сегодня я столкнулся с той же проблемой, что и вы (может быть, вы все еще делаете?)

Я сделал это следующим образом:

Предположим, у меня есть MainActivity, а в MainActivity у меня есть Btn2, который приводит ко второй активности, и Btn3, который приводит к третьей активности.

Я объявил в начале основного действия:

public static boolean shouldPlay = false;

Затем я реализовал свой метод onStop ():

public void onStop() {
    super.onStop();
    if (!shouldPlay) { // it won't pause music if shouldPlay is true
        player.pause();
        player = null;
    }
}

Если булеву shouldPlay присвоено значение true, то мой onStop() не будет вызван полностью, и моя музыка не выключится. Затем я должен решить, когда я установлю его истинным. Когда я переключаюсь с MainActivity на SecondActivity, я делаю это через намерение, и именно тогда я установлю shouldPlay в true:

Button Btn2 = (Button) findViewById(R.id.Btn2);
    Btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            shouldPlay = true;
            startActivity(intent);
        }
    });

И то же самое делается для Btn3.

Теперь последнее, что мы хотим искать, это то, что если бы я вернулся к MainActivity после посещения SecondActivity или ThirdActivity, shouldPlay был бы установлен в true. Первое, что я попробовал должен был установить его в false, как только вторая и третья Activity вызываются (в их onCreate ()), но он хочет работать, может быть, потому, что onStop () от Main и onCreate() от других вызываются одновременно (честно говоря, я действительно не получаю жизненного цикла на данный момент). Что сработало, так это просто установить shouldPlay в false каждый раз, когда мы запускаем onCreate () Main:
shouldPlay = false;

Это работает должным образом для меня. Дай мне знать, если это поможет тебе., Овации, братан.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME){
        Log.d("Jorgesys", "Home button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}

Но эй! Это больше не работает с 4.0 +, прочитайте это: захват главного события

Попробуйте с помощью кнопки назад:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        Log.d("Jorgesys", "Back button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}

Чтобы остановить медиаплеер, вы используете метод:

isFinishing(): если действие завершается, возвращает true; else возвращает false, но вы только приостанавливаете действие, не завершая его. деятельность.

public void onPause() {
      if(this.isFinishing()){  //INCORRECT, Here you are pausing you activity not finishing.
        mp.stop();
      }
    super.onPause(); 
}

Поэтому измените на:

public void onPause() {
    if(mp.isPlaying())
      {
       mp.stop();
      }
    super.onPause(); 
}

Когда ваша деятельность находится на паузе, оценивает, если ваш MediaPlayer играет, если это правда, то останавливает звук.