我想开发一个未接来电探测器。通过广播接收器通知我发现以下link的代码
public abstract class PhoneCallReceiver extends BroadcastReceiver {
static CallStartEndDetector listener;
@Override
public void onReceive(Context context, Intent intent) {
savedContext = context;
if(listener == null){
listener = new CallStartEndDetector();
}
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
public class CallStartEndDetector extends PhoneStateListener {
int lastState = TelephonyManager.CALL_STATE_IDLE;
boolean isIncoming;
public PhonecallStartEndDetector() {}
//Incoming call- IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when hung up
//Outgoing call- from IDLE to OFFHOOK when dialed out, to IDLE when hunged up
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if(lastState == state){
//No change
return;
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
//incoming call started
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//Transition of ringing->offhook are pickups of incoming calls. Nothing down on them
if(lastState != TelephonyManager.CALL_STATE_RINGING){
isIncoming = false;
//outgoing call started
}
break;
case TelephonyManager.CALL_STATE_IDLE:
//End of call(Idle). The type depends on the previous state(s)
if(lastState == TelephonyManager.CALL_STATE_RINGING){
//toast here for missed call
}
else if(isIncoming){
//incoming call ended
}
else{
//outgoing call ended
}
break;
}
lastState = state;
}
}
}
上面的代码很好。但是当我从同一时间得到未接来电时,它会重复未接来电检测。我将如何获得祝酒,请帮助
答案 0 :(得分:6)
大家好,我现在已经得到了解决方案,但未接来电可以正常工作。
此处我的班级代码MyCallListener
由BroadcastReciever
private static boolean ring=false;
private static boolean callReceived=false;
private String callerPhoneNumber;
private Context saveContext;
@Override
public void onReceive(Context mContext, Intent intent)
{
saveContext=mContext;
// Get the current Phone State
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state==null){
return;
}
Bundle bundle = intent.getExtras();
number= bundle.getString("incoming_number");
Calendar calendar=Calendar.getInstance();
currentTimeStamp=calendar.getTimeInMillis();
// If phone state "Rininging"
if(state.equals(TelephonyManager.EXTRA_STATE_RINGING))
{
ring =true;
// Get the Caller's Phone Number
}
// If incoming call is received
if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
{
callReceived=true;
}
// If phone is Idle
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE))
{
// If phone was ringing(ring=true) and not received(callReceived=false) , then it is a missed call
if(ring==true&&callReceived==false)
{
Toast.makeText(mContext, "missed call : "+number, Toast.LENGTH_LONG).show();
//workingWithFunctions();
ring=false;
}
callReceived=false;
}}
别忘了在清单文件中定义接收器
<receiver android:name="com.abc.broadcastrecivers.MyBroadcastReciver" />
应用程序标记中的
答案 1 :(得分:4)
public class callServiceReceiver extends BroadcastReceiver
{
TelephonyManager telephonyManager;
@Override
public void onReceive(Context context, Intent intent)
{
phoneStateListener phoneListener = new phoneStateListener(context);
telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}`enter code here`
public void onDestroy() {
telephonyManager.listen(null, PhoneStateListener.LISTEN_NONE);
}
}
public class phoneStateListener extends PhoneStateListener
{
private Context mContext;
private static boolean ringing =false;
private static boolean call_received =false;
//Constructor
public phoneStateListener(Context context)
{
mContext = context;
}
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
super.onCallStateChanged(state, incomingNumber);
try
{
switch (state)
{
case TelephonyManager.CALL_STATE_RINGING:
ringing = true;
// Get the Caller's Phone Number
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
call_received =true;
break;
case TelephonyManager.CALL_STATE_IDLE:
// If phone was ringing(ringing=true) and not received(call_received=false) , then it is a missed call
if(ringing ==true&& call_received ==false)
{
Toast.makeText(mContext, "missed call : "+incomingNumber, Toast.LENGTH_LONG).show();
ringing =false;
}
call_received =false;
break;
}
}catch (Exception e)
{
e.printStackTrace(System.err);
}
}
}
<receiver android:name=".callServiceReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter>
</receiver>