Android AudioManager оставил AudioFocus не помог другим приложениям воспроизводить музыку

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

Примечание. В этом случае хорошо себя зарекомендовал родной телефонный звонок.

AudioFocusChangeListener:

AudioManager.OnAudioFocusChangeListener mListener 
    = new AudioManager.OnAudioFocusChangeListener() {
   @Override
   public void onAudioFocusChange(int i) {
      MLog.e(TAG, "onAudioFocusChange(" + i + ")");
   }
};
 am.requestAudioFocus(mListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);

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

AudioManager am = getAudioManager();
am.abandonAudioFocus(mListener);

person Guruprasad    schedule 16.11.2017    source источник
comment
после завершения вызова вы получаете какие-либо изменения в onAudioFocusChange(int i) что-то вроде 0 или 1?   -  person King of Masses    schedule 16.11.2017


Ответы (2)


Я не уверен, правильно ли я понял ваш вопрос или нет, но позвольте мне объяснить.

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

Вы звоните с помощью TelephonyManager? Затем вы можете посмотреть на это решение, где вы можете прослушивать изменения в состоянии вызова с помощью PhoneStateListener. Вы можете зарегистрировать слушателя в TelephonyManager:

Если это так, когда вы когда-либо звоните из своего приложения для вызовов Voip, просто проверьте isMusicActive в АудиоМенеджер. Это даст активную музыку, играющую в телефоне, включая пользовательские приложения.

isMusicActive() Проверяет, активна ли музыка. из документов

 AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {
    Intent i = new Intent(SERVICECMD); 
    i.putExtra(CMDNAME , CMDPAUSE ); 
    sendBroadcast(i);
}

Здесь, если MusicActive, то просто передайте его и делайте свое призвание. После того, как вы закончите с вызовом, снова запустите / приостановите музыкальный проигрыватель. Он будет работать для всех проигрывателей, а не только для музыкального проигрывателя по умолчанию.

Управляйте музыкальным проигрывателем Android по умолчанию с помощью этих команд

public static final String CMDTOGGLEPAUSE = "togglepause";
 public static final String CMDPLAY = "play";
 public static final String CMDPAUSE = "pause";
 public static final String CMDPREVIOUS = "previous";
 public static final String CMDNEXT = "next";
 public static final String SERVICECMD = "com.android.music.musicservicecommand";
 public static final String CMDNAME = "command";
 public static final String CMDSTOP = "stop";

В вашем случае, прежде чем совершать voip-звонок из вашего приложения, проверьте, есть ли активная музыка или нет,

 private boolean isSomethingPlaying;

  AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {

   // some music is playing, so make it pause and save the flag for further usage.

   isSomethingPlaying = true;

    Intent i = new Intent(SERVICECMD); 
    i.putExtra(CMDNAME , CMDPAUSE ); 
    sendBroadcast(i);
}

После того, как ваш вызов будет завершен, в этой функции проверьте, не сделали ли вы паузу в музыке, используя трансляцию с флагом.

if(isSomethingPlaying)
{
  // before our call some music is playing. so make it play again.
    isSomethingPlaying = false;
   Intent i = new Intent(SERVICECMD); 
        i.putExtra(CMDNAME , CMDPLAY); 
        sendBroadcast(i);
}
person King of Masses    schedule 16.11.2017
comment
Это сделало трюк для меня. но if(mAudioManager.isMusicActive()) неверно, даже если игрок жив. но я отправил трансляцию вот так, тогда все заработало ... большое спасибо Intent i = new Intent (SERVICECMD); i.putExtra (ИМЯ_CMD, CMDPLAY); отправить широковещательную передачу (я); - person Guruprasad; 16.11.2017
comment
Не могли бы вы сказать мне, в каком случае если (mAudioManager.isMusicActive()) верно - person Guruprasad; 16.11.2017
comment
обычно это должно быть верно всякий раз, когда есть экземпляр аудиоплеера, который находится в активном состоянии, я имею в виду воспроизведение. - person King of Masses; 16.11.2017
comment
Когда я сделал звонок в своем приложении, родной проигрыватель перешел в состояние паузы, а проигрыватель активен. но после моего вызова isMusicActive() становится ложным - person Guruprasad; 16.11.2017
comment
Да, он будет равен false , потому что сейчас игрок неактивен и не играет, для этого вам нужно сохранить флаг перед тем, как поставить игрока на паузу, а после завершения вызова просто установите этот флаг и сделайте игрока активным, иначе оставьте все как есть. - person King of Masses; 16.11.2017
comment
да .. использовал ваше обновление .. это то, что я хочу. Спасибо - person Guruprasad; 17.11.2017
comment
Перед звонком я принял состояние проигрывателя, истинное isMusicActive..во время звонка пользователь убил музыкальное приложение, в этом случае после звонка проигрыватель не должен запускаться. bcz нашей трансляции снова играет. любое решение для этого, пожалуйста. - person Guruprasad; 21.11.2017
comment
Хорошая точка зрения. Нужно проверить на это. Тем временем вы можете найти способ определить состояние музыкального проигрывателя с помощью AudioManager. Я свяжусь с тобой - person King of Masses; 21.11.2017

У меня была такая же проблема. Я играл музыку с VLC, и начался VoIP-звонок. Мое приложение запросило аудиофокус для него с вызовом:

myAudioManager.requestAudioFocus(null, streamType,
    AudioManager.AUDIOFOCUS_GAIN)

(или соответствующий вызов Build.VERSION.SDK_INT >= 26), где streamType было AudioManager.STREAM_RING или AudioManager.STREAM_VOICE_CALL.)

После завершения звонка я правильно отключил аудиофокус с помощью звонка

myAudioManager.abandonAudioFocus(null)

(или соответствующий Build.VERSION.SDK_INT >= 26 вызов). Однако музыка не продолжала играть.

Я исправил проблему, заменив запрос AudioManager.AUDIOFOCUS_GAIN на AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE.

person Juha    schedule 24.10.2019