Domanda

Mentre il debug del codice qui sotto, BroadcastReceiverCustom è essere chiamato ma non è PhoneStateListenerCustom.

Per ora e fare azione necessaria solo in BroadcastReceiverCustom, ma maynot essere il posto migliore per farlo. Qualsiasi suggerimento perché non PhoneStateListener chiamati ?? Già speso molto tempo per motivi possibili, nessuna idea ?? file manifesto è tutto corretto con le autorizzazioni corrette. Non vedo le eccezioni di runtime.

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

    }
}

file manifesto

<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>
È stato utile?

Soluzione

non si deve creare un'istanza della TelephonyManager e PhoneStateListener nel BroadcastReceiver. qui è qualche esempio di codice:

in attività:

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

Altri suggerimenti

prova ad aggiungere il @Override prima che il metodo onCallStateChange

Volevo solo aggiungere che Vairavan menzionato in questa risposta , che ci fosse un cambiamento interno nel modo in cui la PhoneStateListener è riferimento. Ora è tenuto in un riferimento debole, il che significa che una volta che restituisce il metodo, l'istanza PhoneStateListener è elegable per la raccolta dei rifiuti. Pertanto si dovrebbe tenere il riferimento in una classe che verrà persistito per tutta la durata che ci si aspetta di ascoltare per callback, come ad esempio un Activity, Service, o le classi Application.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top