BroadcastReceiverは呼び出されましたが、PhonestateListenerは呼び出されません
-
11-10-2019 - |
質問
以下のコードをデバッグしている間、BroadCastReceiverCustomは呼び出されていますが、PhonestateListenercustomはそうではありません。
今のところ、私はBroadcastreceivercustomのみで必要なアクションを行っていますが、それを行うのに最適な場所ではありません。なぜPhonestateListenerが呼ばれていないのですか?考えられる理由のためにすでに多くの時間を費やしましたか?マニフェストファイルはすべて正しい権限で正しいです。ランタイムの例外はありません。
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);
}
}
マニフェストファイル
<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>
解決
BroadcastReceiverのThelephonyManagerとPhonestateListenerをインスタンス化する必要はありません。これがコードの例です。
アクティビティ:
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);
}
}
}
他のヒント
を追加してみてください @Override
の前に onCallStateChange
方法
Vairavanが言及したことを追加したかっただけです これ 答え、フォネスタテリステナーの参照方法に内部的な変更があったことに答えます。現在、弱い参照に保持されています。つまり、メソッドが戻ってから、フォネスタテリステナーインスタンスがガベージコレクションにエレガントになることを意味します。したがって、あなたは、あなたがコールバックを聞くことを期待する一生の間、持続するクラスに参照を保持する必要があります。 Activity
, Service
, 、 また Application
クラス。
所属していません StackOverflow