【发布时间】:2020-03-12 20:12:59
【问题描述】:
我有一个应用可以在来电结束时做一些事情 我有一个带有两个标志的电话状态侦听器,仅检测已接听的收入电话并将电话号码存储到静态变量中以在通话结束时使用 一个标志,当电话响起时只检测收入,另一个标志,当电话应答时只为应答做事情
一切正常,但我发现如果在通话期间有另一个来电,那么即使拒绝它,我的应用也会为第二收入做一些事情
这是我的代码
public class ServiceReceiver extends BroadcastReceiver {
static boolean is_incoming = false;
static boolean in_call = false; //when incoming call ends check that call was answered
public static String saved_number; //when call answers store number to use when ends
static Context context;
@Override
public void onReceive(Context context, Intent intent) {
ServiceReceiver.context = context;
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //when phone rings
is_incoming = true;
Toast.makeText(context, "ringing", Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer
in_call = true;
saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Toast.makeText(context, "offhook", Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ // when reject or miss or ends
if(in_call && is_incoming) { //answered incoming call ends
doStuff(saved_number);
}
//making flags ready for next use
in_call = false;
is_incoming = false;
}
}
}
我发现,当第二个来电来电时,第二个电话号码会以振铃状态发送广播,但当拒绝时,Android 似乎会发送一个带有第二个号码的摘机广播!
我自己的想法是如果 in_call 已经为真,则进入摘机状态什么都不做(不要更改保存的号码) 所以我把摘机语句改成了这个
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer
if(in_call){
Toast.makeText(context, "inside checking", Toast.LENGTH_SHORT).show();
//return;
}
saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
//Toast.makeText(context, "offhook for " + saved_number, Toast.LENGTH_SHORT).show();
in_call = true;
}
但我发现每次都显示“内部检查”吐司,我使用 !in_call 而不是 in_call 并且神奇地没有任何改变
如果取消注释返回应用程序崩溃
现在我很困惑为什么!!!
请帮忙
【问题讨论】:
标签: android broadcastreceiver android-broadcast telephonymanager phone-state-listener