#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