質問

以下のコードをデバッグしている間、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 クラス。

見る: https://github.com/aosp-mirror/platform_frameworks_base/commit/f5d7c587e86c64e657a15a12ad70e75d47c48d99#diff-5af2ac8999de823cf6057e5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555550.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top