BroadcastReceiver вызван, но PhoneStateListener не вызван - PullRequest
4 голосов
/ 15 января 2011

Во время отладки кода ниже, 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>

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

вы не должны создавать экземпляры TelephonyManager и PhoneStateListener в BroadcastReceiver. Вот пример кода:

в Активности:

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);
        }
    }
}
1 голос
/ 09 октября 2012

попробуйте добавить @Override перед onCallStateChange методом

0 голосов
/ 07 сентября 2018

Я просто хотел добавить, что Вайраван упомянул в этом ответе, что произошло внутреннее изменение в том, как ссылается PhoneStateListener. Теперь он хранится в слабой ссылке, что означает, что как только метод возвращается, экземпляр PhoneStateListener можно использовать для сборки мусора. Следовательно, вы должны хранить ссылку в классе, который будет сохраняться в течение всей жизни, которую вы ожидаете прослушивать для обратных вызовов, таких как Activity, Service или Application классы.

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

...