Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Прежде всего, вы можете прослушивать изменения в состоянии вызова с помощью 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:

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

Подробнее читайте в документации.

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

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

Ответ 2

Я считаю, что 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
    }
}   

}

Надеюсь, вам это поможет: -)

Ответ 3

Я думаю, 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.
}

Ответ 4

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

Создайте приемник с именем 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>

Ответ 6

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

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
      }
    }
  }
};