BroadcastReceiver 在只进行一次调用时检测到两次调用
BroadcastReceiver detects two calls when only one call is made
我制作了一个服务 class 并在其中 class 我制作了如下所示的 BroadcastReceiver:
final BroadcastReceiver receiver = new BroadcastReceiver() {
private ITelephony telephonyService;
public void onReceive(Context context, Intent intent) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
//Call Rejection
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(tm);
Bundle bundle = intent.getExtras();
String phoneNumber = bundle.getString("incoming_number");
telephonyService.silenceRinger();
telephonyService.endCall();
//Checking if number is in contact list
String name=findNameByNumber(phoneNumber);
if(name.equals("Not Found"))
{
//Name Not Found
}
else
{
//name Found
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
findNameByNumber 检查号码是否在我的联系人列表中:
private String findNameByNumber(String incomingNumber) {
String res = "Not Found";
try {
ContentResolver resolver = getApplicationContext().getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber));
Cursor c = resolver.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
res = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
}
c.close();
}
} catch (Exception ex) {
Toast.makeText(getApplicationContext(),ex.toString(), Toast.LENGTH_SHORT).show();
}
return res;
}
这就是我的 IntentFilter 对象在服务 class 中使用接收器的样子:
IntentFilter filter = new IntentFilter();
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
registerReceiver(receiver,filter);
但是,当一个电话来电时,它被检测为两个电话而不是一个。我该如何解决?
从intent读取获取调用状态
这里涉及两个状态变化:
一次是从空闲到振铃
另一个是从振铃到空闲
String phoneState = intent.getStringExtra(Phone.STATE_KEY);
mPhoneState = (Phone.State) Enum.valueOf(
Phone.State.class, phoneState);
public class PhoneState extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
//Some Action
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_RINGING:
//Some Action
break;
//case TelephonyManager.ANOTHER_STATE: ...
}
}
}
我制作了一个服务 class 并在其中 class 我制作了如下所示的 BroadcastReceiver:
final BroadcastReceiver receiver = new BroadcastReceiver() {
private ITelephony telephonyService;
public void onReceive(Context context, Intent intent) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
//Call Rejection
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(tm);
Bundle bundle = intent.getExtras();
String phoneNumber = bundle.getString("incoming_number");
telephonyService.silenceRinger();
telephonyService.endCall();
//Checking if number is in contact list
String name=findNameByNumber(phoneNumber);
if(name.equals("Not Found"))
{
//Name Not Found
}
else
{
//name Found
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
findNameByNumber 检查号码是否在我的联系人列表中:
private String findNameByNumber(String incomingNumber) {
String res = "Not Found";
try {
ContentResolver resolver = getApplicationContext().getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber));
Cursor c = resolver.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
res = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
}
c.close();
}
} catch (Exception ex) {
Toast.makeText(getApplicationContext(),ex.toString(), Toast.LENGTH_SHORT).show();
}
return res;
}
这就是我的 IntentFilter 对象在服务 class 中使用接收器的样子:
IntentFilter filter = new IntentFilter();
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
registerReceiver(receiver,filter);
但是,当一个电话来电时,它被检测为两个电话而不是一个。我该如何解决?
从intent读取获取调用状态
这里涉及两个状态变化: 一次是从空闲到振铃 另一个是从振铃到空闲
String phoneState = intent.getStringExtra(Phone.STATE_KEY);
mPhoneState = (Phone.State) Enum.valueOf(
Phone.State.class, phoneState);
public class PhoneState extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
//Some Action
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_RINGING:
//Some Action
break;
//case TelephonyManager.ANOTHER_STATE: ...
}
}
}