Nie można wykryć, kiedy połączenie wychodzące jest odbierane w systemie Android

Aby wykryć, kiedy połączenie wychodzące zostało odebrane, próbowałem utworzyćPhoneStateListener i nasłuchiwaćTelephonyManagerjestCALL_STATE_RINGING, CALL_STATE_OFFHOOK, iCALL_STATE_IDLE, zto pytanie, ale nie działa, jak wyjaśniono poniżej.

Najpierw zarejestrowałem następujące pozwolenie w manifeście:

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

NastępnieBroadcastReceiver nazywaOutCallLogger to łapieNEW_OUTGOING_CALL zdarzenie za każdym razem, gdy wykonywane jest połączenie wychodzące:

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

Dalej, moja realizacjaOutCallLogger. Ustawiłem boolean o nazwienoCallListenerYet aby uniknąć dołączania nowegoPhoneStateListener doTelephonyManager kiedy tylkoonReceive() jest wywoływany.

public class OutCallLogger extends BroadcastReceiver {

    private static boolean noCallListenerYet = true;

    @Override
    public void onReceive(final Context context, Intent intent) {
        number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        if (noCallListenerYet) {
            final TelephonyManager tm = (TelephonyManager) context.getSystemService(
                    Context.TELEPHONY_SERVICE);
            tm.listen(new PhoneStateListener() {
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    switch (state) {
                        case TelephonyManager.CALL_STATE_RINGING:
                            Log.d(This.LOG_TAG, "RINGING");
                            break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                            Log.d(This.LOG_TAG, "OFFHOOK");
                            break;
                        case TelephonyManager.CALL_STATE_IDLE:
                            Log.d(This.LOG_TAG, "IDLE");
                            break;
                        default:
                            Log.d(This.LOG_TAG, "Default: " + state);
                            break;
                    }
                }
            }, PhoneStateListener.LISTEN_CALL_STATE);
            noCallListenerYet = false;
        }
    }

}

Teraz, gdy wykonuję połączenie wychodzące w moim urządzeniu,CALL_STATE_RINGING NIGDY nie jest wywoływany. Zawsze otrzymuję wydruki „IDLE” do „OFFHOOK”, gdy druga linia zaczyna dzwonić, nic nie odpowiada, gdy połączenie zostanie odebrane, a wydruk „IDLE” ponownie, gdy połączenie zostanie zakończone.

Jak mogę wiarygodnie wykryć, kiedy połączenie wychodzące jest odbierane w Androidzie, a może nawet?

questionAnswers(6)

yourAnswerToTheQuestion