수신 전화에서 음악 중지 및 시작
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
'UFO ET IT' 카테고리의 다른 글
React Native :`run-ios` 명령이 인식되지 않습니다. (0) | 2021.01.09 |
---|---|
If (Array.Length == 0) (0) | 2021.01.09 |
포인터의 크기는 얼마입니까? (0) | 2021.01.09 |
자바에서 호출자 클래스를 얻는 방법 (0) | 2021.01.09 |
파이썬의 문자열에서 ANSI 이스케이프 시퀀스를 제거하는 방법 (0) | 2021.01.09 |