Входящие и исходящие звонки в BroadcastReceiver
Существует услуга, в которой обработанный медиаплеер захочет сделать это для того, чтобы служба входящего и исходящего вызова остановила медиаплеер, и в конце потока вызовов возобновляет воспроизведение. Теперь удалось только остановить воспроизведение на входящих и исходящих вызовах, следует добавить код для воспроизведения TelephonyManager.CALL_STATE_IDLE: тогда разговор через некоторое время начинается музыка, как это исправить?
public class CallReceiver extends BroadcastReceiver{
TelephonyManager telManager;
Context context;
boolean startedCall = false;
@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) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
if(incomingNumber!=null)
{
//incoming call
MediaService.stopMP();
startedCall = true;
}
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
if(incomingNumber!=null)
{
//outgoing call
MediaService.stopMP();
startedCall = true;
}
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
if(startedCall)
{
MainActivity.titleMusic.setVisibility(View.VISIBLE);
MainActivity.Play();
MediaService.startMP();
startedCall = false;
}
break;
}
default: { }
}
} catch (Exception ex) {
}
}
};
}
1 ответ
Решение
Всякий раз, когда перед вызовом состояние вызова должно быть TelephonyManager.CALL_STATE_IDLE
До получения входящего вызова состояние вызова должно быть IDEL, поэтому необходимо установить флаг логического типа для идентификации состояния;
public class CallReceiver extends BroadcastReceiver{
TelephonyManager telManager;
Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context=context;
private boolean startedCall = false; // New added boolean
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) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
if(incomingNumber!=null) {
//incoming call
MainActivity.stopMP()
}
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
startedCall = true; // Newly added code
if(incomingNumber!=null) {
//outgoing call
MainActivity.stopMP();
}
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
if(startedCall) {
MainActivity.titleMusic.setVisibility(View.VISIBLE);
MainActivity.Play();
MediaService.startMP();
}
break;
}
default: { }
}
} catch (Exception ex) {
}
}
};
}