4 Stimmen

BroadcastReceiver aufgerufen, aber PhoneStateListener nicht aufgerufen

Beim Debuggen des nachstehenden Codes wird BroadcastReceiverCustom aufgerufen, PhoneStateListenerCustom jedoch nicht.

Im Moment führe ich die erforderliche Aktion nur in BroadcastReceiverCustom durch, aber möglicherweise nicht der beste Ort, um es zu tun. Irgendwelche Vorschläge, warum PhoneStateListener nicht aufgerufen wird? Bereits verbrachte viel Zeit für mögliche Gründe, keine Idee? Manifest-Datei ist alles richtig mit korrekten Berechtigungen. Ich sehe keine Laufzeitausnahmen.

BroadcastReceiverCustom.java

public class BroadcastReceiverCustom extends BroadcastReceiver {

private static final String TAG = "BroadcastReceiverCustom";

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");

        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        PhoneStateListenerCustom phoneStateListenerCustom = new PhoneStateListenerCustom();
        telephony.listen(phoneStateListenerCustom, PhoneStateListener.LISTEN_CALL_STATE);
    }
}

PhoneStateListenerCustom.java

public class PhoneStateListenerCustom extends PhoneStateListener {

    private static final String TAG = "PhoneStateListenerCustom";

    public void onCallStateChange(int state, String incomingNumber){

        Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
        switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
                 Log.d(TAG, "RINGING");
                 break;
        }

        super.onCallStateChanged(state, incomingNumber);

    }
}

Manifest-Datei

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<receiver android:name=".BroadcastReceiverCustom">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

4voto

moonlightcheese Punkte 10490

Sie sollten den TelephonyManager und PhoneStateListener nicht im BroadcastReceiver instanziieren. Hier ist ein Beispielcode:

in Aktivität:

EndCallListener callListener = new EndCallListener;
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

private class EndCallListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(LOG_TAG + "Listener", "RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
            Log.i(LOG_TAG + "Listener", "OFFHOOK, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_IDLE == state) {
            Log.i(LOG_TAG + "Listener", "IDLE, number: " + incomingNumber);
        }
    }
}

1voto

Evgeny Erlihman Punkte 448

Versuchen Sie, die @Override vor dem onCallStateChange Methode

1voto

TheIT Punkte 11363

Ich wollte nur hinzufügen, dass Vairavan in diese Antwort, dass es eine interne Änderung darin gab, wie der PhoneStateListener referenziert wird. Er wird jetzt in einer schwachen Referenz gehalten, was bedeutet, dass die PhoneStateListener-Instanz für die Garbage Collection geeignet ist, sobald die Methode zurückkehrt. Daher sollten Sie die Referenz in einer Klasse halten, die für die Dauer der erwarteten Rückrufe persistiert wird, z. B. in einer Activity , Service o Application Klassen.

Siehe: https://github.com/aosp-mirror/platform_frameworks_base/commit/f5d7c587e86c64e657a15a12ad70e75d47c48d99#diff-5af2ac899de823cf60597e554bf67fe0 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X