Остановка и запуск музыки при входящих вызовах

Я внедрил Activity, который воспроизводит медиа с URL-адреса в android

Чтобы добавить функциональность паузы при входящем входящем вызове, я создал приемник, который устанавливает переменную aa при поступлении вызова. Активность считывает эту переменную, а затем приостанавливает музыку в методе onPause (), а сброс – когда вызов выполняется, и активность возобновляет музыку в методе onResume ()

Это прекрасно работает, так как активная деятельность сосредоточена. Если я вернусь к главному экрану во время воспроизведения музыки, а затем придет звонок, функция onpause не будет вызвана и, следовательно, я могу «остановить и запустить музыку»

Каков путь для этого? Кто-нибудь реализовал медиа-плеер, чтобы он постоянно перехватывал входящие и исходящие звонки и останавливался и правильно запускал музыку?

Solutions Collecting From Web of "Остановка и запуск музыки при входящих вызовах"

Есть несколько вещей, которые вы можете сделать:

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

 PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { if (state == TelephonyManager.CALL_STATE_RINGING) { //Incoming call: Pause music } else if(state == TelephonyManager.CALL_STATE_IDLE) { //Not in call: Play music } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) { //A call is dialing, active or on hold } super.onCallStateChanged(state, incomingNumber); } }; TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } 

Не забудьте PhoneStateListener.LISTEN_NONE регистрацию слушателя, когда он больше не нужен, используя PhoneStateListener.LISTEN_NONE :

 TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } 

Для получения дополнительной информации прочтите документацию .

Еще одна вещь, которую вы можете сделать, это прослушивание широковещательного android.intent.action.PHONE_STATE . Он будет содержать дополнительный TelephonyManager.EXTRA_STATE который предоставит вам информацию о вызове. Взгляните на документацию здесь .

Обратите внимание, что в обоих случаях вам понадобится андроид.permission.READ_PHONE_STATE.

Я считаю, что AudioManager – лучшее и быстрое решение. Вот мой пример реализации:

 public class MyActivity extends Activity implements OnAudioFocusChangeListener { private AudioManager mAudioManager; @Override public void onCreate(Bundle savedInstanceState) { ... mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); ... } @Override public void onDestroy(){ super.onDestroy(); ... mAudioManager.abandonAudioFocus(this); ... } @Override public void onAudioFocusChange(int focusChange) { if(focusChange<=0) { //LOSS -> PAUSE } else { //GAIN -> PLAY } } 

}

Надеюсь, это поможет вам 🙂

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

Аудиофокус является кооперативным по своей природе. То есть ожидается, что приложения будут (и настоятельно рекомендуется) соблюдать рекомендации по фокусировке звука, но правила не применяются системой. Если приложение хочет воспроизводить громкую музыку даже после потери фокуса звука, ничто в системе не предотвратит это. Тем не менее, у пользователя больше вероятность иметь плохой опыт и, скорее всего, удалит неправильное приложение.

Чтобы запросить фокус звука, вы должны вызвать requestAudioFocus () из AudioManager, как показано в примере ниже:

 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // could not get audio focus. } 

ИЛИ – Вы можете попробовать приложение-получатель.

Создайте приемник с именем CallRecord.java

 package com.example.callreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class CallReceiver extends BroadcastReceiver{ TelephonyManager telManager; Context context; @Override public void onReceive(Context context, Intent intent) { this.context=context; telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); } private final PhoneStateListener phoneListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_RINGING: { //PAUSE break; } case TelephonyManager.CALL_STATE_OFFHOOK: { break; } case TelephonyManager.CALL_STATE_IDLE: { //PLAY break; } default: { } } } catch (Exception ex) { } } }; } 

Затем добавьте эту строку в файл manifest.xml, чтобы зарегистрировать ее в приложении.

 <receiver android:name="CallReceiver" > <intent-filter> <action android:name="android.intent.action.PHONE_STATE" > </action> </intent-filter> </receiver> 

ИМХО лучший способ описан в off docs: http://developer.android.com/training/managing-audio/audio-focus.html

Для меня неактивное состояние пришло во время входящего вызова, быстрое исправление заключается в проверке широковещательного приемника

 BroadcastReceiver phonestatereceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { //play here } } } };