广播接收器被调用但电话状态监听器未被调用。

4
在调试下面的代码时,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个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

您不应该在BroadcastReceiver中实例化TelephonyManager和PhoneStateListener。以下是一些示例代码:

在Activity中:

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
显然,在 OFFHOOK 和 IDLE 状态下,您不会收到 incomingNumber。这是我编写的一些代码,以说明这个事实。 - moonlightcheese

1

我只是想补充一下,Vairavan在this的答案中提到,PhoneStateListener的引用方式发生了内部变化。现在它被保存在一个弱引用中,这意味着一旦方法返回,PhoneStateListener实例就可以被垃圾回收。因此,您应该在一个类中持有引用,这个类将在您期望监听回调的生命周期内持久存在,例如ActivityServiceApplication类。

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


1
尝试在 onCallStateChange 方法前添加 @Override

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,