BroadcastReceiver chiamato ma non PhoneStateListener chiamato
-
11-10-2019 - |
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>
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
.