UFO ET IT

수신 전화에서 음악 중지 및 시작

ufoet 2021. 1. 9. 10:37
반응형

수신 전화에서 음악 중지 및 시작


Android의 URL에서 미디어를 재생하는 활동을 구현했습니다.

수신 전화가 올 때 일시 중지 기능을 추가하기 위해 전화가 올 때 변수를 설정하는 수신기를 만들었습니다. 액티비티는이 변수를 읽은 다음 onPause () 메서드에서 음악을 일시 중지하고 호출이 완료되고 액티비티가 onResume () 메서드에서 음악을 다시 시작할 때 재설정됩니다.

이것은 활동에 초점이있는 한 잘 작동합니다. 음악이 재생되는 동안 홈 화면으로 돌아가서 전화가 오면 활동의 onpause가 호출되지 않으므로 음악을 중지하고 시작할 수 있습니다.

이것에 대한 탈출구는 무엇입니까? 수신 및 발신 전화를 항상 차단하고 음악을 올바르게 중지하고 시작하도록 미디어 플레이어를 구현 한 사람이 있습니까?


다음과 같은 몇 가지 작업을 수행 할 수 있습니다.

우선,을 사용하여 통화 상태의 변경 사항을 수신 할 수 있습니다 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두 경우 모두-권한 이 필요합니다 .


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

}

도움이 되었기를 바랍니다. :-)


또는-수신자 애플리케이션을 사용해 볼 수 있습니다.

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>

requestAudioFocus () 가이 경우를 자동으로 처리 할 수 ​​있어야 한다고 생각 합니다. 호출 상태를 명시 적으로 확인할 필요가 없습니다.

Audio Focus는 본질적으로 협력 적입니다. 즉, 응용 프로그램은 오디오 포커스 지침을 준수 할 것으로 예상되지만 (매우 권장 됨) 규칙은 시스템에 의해 시행되지 않습니다. 응용 프로그램이 오디오 포커스를 잃은 후에도 시끄러운 음악을 재생하려는 경우 시스템의 어떤 것도이를 막을 수 없습니다. 그러나 사용자는 나쁜 경험을 할 가능성이 더 높고 오작동하는 응용 프로그램을 제거 할 가능성이 더 높습니다.

오디오 포커스를 요청하려면 아래 예제와 같이 AudioManager에서 requestAudioFocus ()를 호출해야합니다.

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

IMHO better way is described in off docs: http://developer.android.com/training/managing-audio/audio-focus.html


For me idle state was coming while there was incoming call, the quick fix is to check in the broadcast receiver

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

ReferenceURL : https://stackoverflow.com/questions/5610464/stopping-starting-music-on-incoming-calls

반응형