Question

Lors du débogage du code ci-dessous, est BroadcastReceiverCustom être appelé mais PhoneStateListenerCustom est pas.

Pour l'instant je et de faire l'action nécessaire dans BroadcastReceiverCustom seulement, mais maynot être le meilleur endroit pour le faire. Toutes les suggestions pourquoi PhoneStateListener pas appelé ?? Déjà passé beaucoup de temps pour des raisons possibles, aucune idée ?? fichier manifest est tout correct avec des autorisations correctes. Je ne vois pas d'exceptions d'exécution.

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);

    }
}

fichier Manifest

<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>
Était-ce utile?

La solution

vous ne devriez pas instancier le TelephonyManager et PhoneStateListener dans le BroadcastReceiver. voici quelques exemples de code:

Activité:

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);
        }
    }
}

Autres conseils

essayez d'ajouter la @Override avant que la méthode onCallStateChange

Je voulais juste ajouter que Vairavan mentionné dans cette réponse , qu'il y avait un changement interne dans la façon dont l'PhoneStateListener est référencé. Il est maintenant détenu dans une référence faible, ce qui signifie qu'une fois que la méthode renvoie, l'instance de PhoneStateListener est elegable pour la collecte des ordures. Par conséquent, vous devez tenir la référence dans une classe qui sera persisté pendant toute la durée que vous attendez d'écouter les callbacks, comme un Activity, Service ou classes Application.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top