Почему получатель phoneState получает пустой входящий номер - PullRequest
0 голосов
/ 21 октября 2018

Я хочу заблокировать исходящие и входящие звонки, если телефонный номер отсутствует в белом списке приложений и имеется более одной широковещательной рассылки, а у первого пустой входящий номер, так что звонок не блокируется и в большинстве случаев работает нормально, потому чтополучатель получает входящий номер.Почему это пустой номер и как я могу обработать пустую трансляцию?

public class CallServiceReciver extends BroadcastReceiver {

private TelephonyManager telephony;
private ITelephony telephonyService;

private Context context;

public void onReceive(final Context context, Intent intent) {


    this.context = context;

    if(!intent.getAction().equals("android.intent.action.PHONE_STATE")){
        return;
    }
    telephony = (TelephonyManager) context.getApplicationContext()
            .getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(new TellListener(), PhoneStateListener.LISTEN_CALL_STATE);
    try {
        Class c = Class.forName(telephony.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        telephonyService = (ITelephony) m.invoke(telephony);

    } catch (Exception e) {
        e.printStackTrace();
    }

private class TellListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);

        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:

                if (incomingNumber == null || incomingNumber.equals("")) {
                    return;
                }
                    try {
                        inComingCallAuthorization(((ParentalControl)context.getApplicationContext()).makeCheckPhoneNumber(incomingNumber));
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                break;
            case TelephonyManager.CALL_STATE_IDLE:
                Log.i("anarestan", "Call End" + incomingNumber);

                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                if (incomingNumber == null || incomingNumber.equals("")) {
                    return;
                }
                try {
                    Log.i(TAG, "onCallStateChanged:  offhook");
                    outGoinCallAuthorization(((ParentalControl)context.getApplicationContext()).makeCheckPhoneNumber(incomingNumber));
                } catch (RemoteException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                } catch (Exception e){
                    e.printStackTrace();
                }
                break;
            default:
                break;
        }

        super.onCallStateChanged(state, incomingNumber);

    }
}

манифест

    <receiver android:name=".reciver.CallServiceReciver"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="2147483647">
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>

1 Ответ

0 голосов
/ 21 октября 2018

Вам не нужен такой подход.Вам нужен BroadcastReceiver для перехвата намерения NEW_OUTGOING_CALL, но обязательно установите приоритет фильтра намерений на «-1».Чтобы прервать исходящий вызов, вам нужно вызвать «setResultData (null)».

Более подробное объяснение: это конкретное намерение «Упорядочено».Это означает, что это намерение уважает «Приоритет», который вы назначаете для его обработки.Таким образом, если ваш приоритет наивысший, вы будете первым, кто будет управлять им, а затем вы измените его значение, чтобы другие слушатели намерений использовали измененное и неработающее намерение.

...