Как вы получаете исходящий звонок в широковещательном приемнике? - PullRequest
6 голосов
/ 05 марта 2012

Я пытаюсь определить и перейти к операции после инициации исходящего вызова.Я использовал ACTION_NEW_OUTGOING_CALL в фильтре Intent.Однако, как я могу определить, что вызов является исходящим.Я сделал это для входящего вызова (как показано ниже), но что я могу использовать вместо EXTRA_STATE_RINGING.

public class OutgoingBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
        {
            Intent i = new Intent(context, OutgoingCallScreenDisplay.class);
            i.putExtras(intent);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

enter image description here

Ответы [ 2 ]

7 голосов
/ 05 марта 2012
public class OutgoingBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
           // If it is to call (outgoing)
           Intent i = new Intent(context, OutgoingCallScreenDisplay.class);
           i.putExtras(intent);
           i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           context.startActivity(i);
        }
    }
}

ACTION_NEW_OUTGOING_CALL является объявлением константы в классе Intent, а не в TelephonyManager. Когда появляется исходящий вызов, система передает намерение с этой константой. Если вы действительно хотите перехватить исходящий вызов с помощью TelephonyManager, сделайте следующее:

TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);   
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
PhoneStateListener listener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        // TODO Auto-generated method stub

        super.onCallStateChanged(state, incomingNumber);
        switch(state) {
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                if(incomingNumber==null) {
                    //outgoing call
                } else {
                    //incoming call
                }
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                if(incomingNumber==null) {
                    //outgoing call
                } else {
                    //incoming call
                }
                break;
        }
    }
};
5 голосов
/ 15 августа 2014

Обнаружение события исходящего телефонного звонка

1.Создать OutgoingCallBroadcastReceiver

public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(OutgoingCallReceiver.class.getSimpleName(), intent.toString());
        Toast.makeText(context, "Outgoing call catched!", Toast.LENGTH_LONG).show();
        //TODO: Handle outgoing call event here
    }
}

2.Зарегистрируйте OutgoingCallBroadcastReceiver в AndroidManifest.xml

<receiver android:name=".OutgoingCallReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
</receiver>

3.Разрешение на добавление в AndroidManifest.xml

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
...