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: ...
    }
    }
}