Rundfunkstrecker rufen aber Phonestatelistener nicht an genannt
-
11-10-2019 - |
Frage
Während des Debugges des folgenden Codes wird der Rundfunkstift aufgerufen, aber Phonestatelistenercustom ist dies nicht der Fall.
Im Moment und ich erforderte nur Maßnahmen im Rundfunkstock, aber Maynot ist der beste Ort, um dies zu tun. Irgendwelche Vorschläge, warum Phonestatelistener nicht angerufen wird? Ich habe schon viel Zeit aus möglichen Gründen verbracht, keine Ahnung? Die Manifestdatei ist mit korrekten Berechtigungen korrekt. Ich sehe keine Laufzeitausnahmen.
Sendercastreceivercustom.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);
}
}
Manifestdatei
<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>
Lösung
Sie sollten den TelephonyManager und den Phonestatelistener im Rundfunkstock nicht 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);
}
}
}
Andere Tipps
Versuchen Sie das Hinzufügen der @Override
Vor dem onCallStateChange
Methode
Ich wollte nur hinzufügen, dass Vairavan in erwähnt wird Dies Antwort, dass es eine interne Veränderung in der Referenzung des Phonestatelistenereres gab. Es wird nun in einer schwachen Referenz gehalten, was bedeutet, dass die Phonestatelistener -Instanz, sobald die Methode zurückkehrt, für die Müllsammlung elegierbar ist. Daher sollten Sie die Referenz in einer Klasse halten, die für die Lebensdauer, die Sie erwarten, auf Rückrufe zu hören, wie z. Activity
, Service
, oder Application
Klassen.