Android阻止呼出问题



我想根据一些逻辑阻止正在进行的呼叫。我使用下面的代码

public class OutgoingCallReceiver extends BroadcastReceiver {
    private OutgoingCallListener customPhoneListener = null;
    public static boolean check = true;
    @Override
    public void onReceive(Context context, Intent intent) {
            String originalNumber = intent
                    .getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            TelephonyManager telephony = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
            customPhoneListener = new OutgoingCallListener(context,
                    originalNumber);
            telephony.listen(customPhoneListener,
                    PhoneStateListener.LISTEN_CALL_STATE);
        }
    }
}

  // Blocking call
            public void blockCall(Context context) {
                try {
                    TelephonyManager tm = (TelephonyManager) context
                            .getSystemService(Context.TELEPHONY_SERVICE);
                    Class<?> c = Class.forName(tm.getClass().getName());
                    Method m = c.getDeclaredMethod("getITelephony");
                    m.setAccessible(true);
                    ITelephony telephonyService = (ITelephony) m.invoke(tm);
                    telephonyService = (ITelephony) m.invoke(tm);
                    // telephonyService.silenceRinger();
                    telephonyService.endCall();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<receiver android:name="com.demo.example.OutgoingCallReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

问题是::当我从我的手机打电话。Onreceive调用多次,它给出不同的号码

请帮帮我。谢谢你。

我也面临同样的问题。这是因为使用了。

这里首先将你的号码存储在某个对象中。请看下面的代码

   <receiver android:name="com.perumaltt.cloud.receiver.ProcessCall" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

public class ProcessCall extends BroadcastReceiver {
    public static String number;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String originalNumber = intent
                .getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        System.out.println("originalNumber :::: " + originalNumber);
        if (originalNumber != null) {
            number = originalNumber;
        }

        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        MyPhoneStateListener listener = new MyPhoneStateListener(context,originalNumber);
        telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }
}


// My listener
    public class MyPhoneStateListener extends PhoneStateListener {
        Context context;
        String outGoingCall;
        public MyPhoneStateListener(Context context, String outGoingCall) {
            super();
            this.context = context;
            this.outGoingCall = outGoingCall;
        }
        @Override
        public void onCallStateChanged(int state, String callingNumber) {
            System.out.println("callingNumber MyPhoneStateListener before"
                    + callingNumber);
            // Log.i("callingNumber :::: MyPhoneStateListener ", outGoingCall);
    //      if(callingNumber == null || callingNumber.trim().length() < 3){
    //          return;
    //      }
    //      if(outGoingCall == null || outGoingCall.trim().length() < 3){
    //          return;
    //      }
            System.out.println("callingNumber MyPhoneStateListener after"
                    + callingNumber);
            System.out.println("state ::: "+state);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                // handle out going call
                callOut(outGoingCall);
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                // handle in coming call
                endCallIfBlocked(callingNumber);
                break;
            default:
                break;
            }
            super.onCallStateChanged(state, callingNumber);
        }
        synchronized private void callOut(String outGoingCall1) {
            if(outGoingCall1 == null){
                return;
            }
            if(ProcessCall.number.equalsIgnoreCase(outGoingCall1)){
                System.out.println("yes same ******** ");
            }else {
                System.out.println("not same ******* ");
                return;
            }
            System.out.println("call out :::: "+outGoingCall1);
            if (UserDetials.getInstance().getCallController().ismCallOutList()
                    && outGoingCall != null) {
                ArrayList<ContactsModel> numbers = CloudApplication.database
                        .getContacts(MySQLiteHelper.COLUMN_PHONE_NUMBER,
                                outGoingCall);
                if (numbers.size() > 0) {
                    ContactsModel model = numbers.get(0);
                    System.out.println("type :::: " + model.getType());
                    if (model.getType() != Constants.CALL_OUT) {
                        CommonMethods.getInstance().blockCall(context,outGoingCall1,Constants.CALL_OUT);
                    }
                }else{
                    CommonMethods.getInstance().blockCall(context,outGoingCall1,Constants.CALL_OUT);
                }
            }
        }
        private void endCallIfBlocked(String callingNumber) {
            System.out.println("endCallIfBlocked :::: endCallIfBlocked");
            ArrayList<ContactsModel> numbers = CloudApplication.database
                    .getContacts(MySQLiteHelper.COLUMN_PHONE_NUMBER, callingNumber);
            if (UserDetials.getInstance().getCallController().ismCallInList()) {
                if (numbers.size() > 0) {
                    ContactsModel model = numbers.get(0);
                    if (model.getType() != Constants.CALL_IN) {
                        CommonMethods.getInstance().blockCall(context,callingNumber,Constants.CALL_IN);
                    }
                } else {
                    CommonMethods.getInstance().blockCall(context,callingNumber,Constants.CALL_IN);
                }
            } else if (UserDetials.getInstance().getCallController().ismBlockList()) {
                if (numbers.size() > 0) {
                    ContactsModel model = numbers.get(0);
                    if (model.getType() == Constants.BLOCK_LIST) {
                        CommonMethods.getInstance().blockCall(context,callingNumber,Constants.BLOCK_LIST);
                    }
                }
            }
        }
    }

// Blocking code
 public void blockCall(Context context) {
                try {
                    TelephonyManager tm = (TelephonyManager) context
                            .getSystemService(Context.TELEPHONY_SERVICE);
                    Class<?> c = Class.forName(tm.getClass().getName());
                    Method m = c.getDeclaredMethod("getITelephony");
                    m.setAccessible(true);
                    ITelephony telephonyService = (ITelephony) m.invoke(tm);
                    telephonyService = (ITelephony) m.invoke(tm);
                    telephonyService.endCall();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

就是这样。喜欢

最新更新