Android AudioFocus onAudioFocusChange не прослушивает изменения

#java #audio #android-audiomanager #implements #changelistener

#java #Аудио #android-audiomanager #реализует #changelistener

Вопрос:

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

 public void play() {
Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        MainActivity.this.sendBroadcast(i);
        int requestAudioFocus = AM.requestAudioFocus(afChangeListener, AudioManager.AUDIOFOCUS_GAIN, AudioManager.STREAM_MUSIC);
        if (requestAudioFocus == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Toast.makeText(this, "Focus Granted", Toast.LENGTH_SHORT).show();
            if (!mediaPlayer.isPlaying() || mediaPlayer == null) {
                mediaPlayer.start();
                handler.removeCallbacks(moveSeekBarThread);
                handler.postDelayed(moveSeekBarThread, 300);
            }
        } else {
            Toast.makeText(this, "Focus Not Granted", Toast.LENGTH_LONG).show();
            return;
        }
    }
  

в верхней части моего метода play (), однако он по-прежнему воспроизводит музыку других приложений поверх этого.

Пока у меня есть:

 public class MainActivity extends AppCompatActivity implements             
AudioManager.OnAudioFocusChangeListener {

...

}
  

За которым следует блок прослушивателя:

 @Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                Toast.makeText(this, "FOCUS LOSS TRANSIENT", Toast.LENGTH_SHORT).show();
                pause();
                break;
            case AudioManager.AUDIOFOCUS_LOSS:
                pause();
                Toast.makeText(this, "FOCUS LOST", Toast.LENGTH_SHORT).show();
                break;
            case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
                Intent i = new Intent("com.android.music.musicservicecommand");
                i.putExtra("command", "pause");
                MainActivity.this.sendBroadcast(i);
                AM.setStreamVolume(AudioManager.STREAM_MUSIC, AM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
                play();
            case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
                stop();
                break;
            case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
                Intent iARG = new Intent("com.android.music.musicservicecommand");
                iARG.putExtra("command", "pause");
                MainActivity.this.sendBroadcast(iARG);
                AM.setStreamVolume(AudioManager.STREAM_MUSIC, AM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
                play();
                break;
        }
    }
  

Я также пробовал реализацию вне объявления класса и назначение

 AudioManager.OnAudioFocusChangeListener = new onAudioFocusChangeListener(){
public void onAudioFocusChange(int focusChange){
...
}
  

однако, как глобальная функция, это также не прослушивало изменения focusChange

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

 int requestAudioFocus = AM.requestAudioFocus(null, AudioManager.AUDIOFOCUS_GAIN, AudioManager.STREAM_MUSIC);
        if (requestAudioFocus == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Intent i = new Intent("com.android.music.musicservicecommand");
            i.putExtra("command", "pause");
            MainActivity.this.sendBroadcast(i);
}
  

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

Ответ №1:

Это была простая ошибка, вместо создания экземпляра ‘this’ (экземпляр) для прослушивателя я использовал альтернативный прослушиватель, который я ранее определил, но забыл удалить. Поскольку прослушиватель был реализован в MainActivity:

 public class MainActivity extends AppCompatActivity implements AudioManager.OnAudioFocusChangeListener {

AM.requestAudioFocus(afChangeListener <-- should have been 'this',
                // Use the music stream.
                AudioManager.STREAM_MUSIC,
                // Request permanent focus.
                AudioManager.AUDIOFOCUS_GAIN);
  

requestAudioFocus() был объявлен неправильно.

Вариант переключения для изменения фокуса был написан правильно:

 @Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                Toast.makeText(this, "FOCUS LOSS TRANSIENT", Toast.LENGTH_SHORT).show();
                pause();
                break;
            case AudioManager.AUDIOFOCUS_LOSS:
                pause();
                Toast.makeText(this, "FOCUS LOST", Toast.LENGTH_SHORT).show();
                break;
            case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
                Intent i = new Intent("com.android.music.musicservicecommand");
                i.putExtra("command", "pause");
                MainActivity.this.sendBroadcast(i);
                AM.setStreamVolume(AudioManager.STREAM_MUSIC, AM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
                play();
            case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
                stop();
                break;
            case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
                Intent iARG = new Intent("com.android.music.musicservicecommand");
                iARG.putExtra("command", "pause");
                MainActivity.this.sendBroadcast(iARG);
                AM.setStreamVolume(AudioManager.STREAM_MUSIC, AM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
                play();
                break;
        }
    }
  

При этом реализация в MainActivity также написана правильно:

 public class MainActivity extends AppCompatActivity implements AudioManager.OnAudioFocusChangeListener