【问题标题】:android PhoneStateListener onCallStateChanged strange behaviourandroid PhoneStateListener onCallStateChanged 奇怪的行为
【发布时间】:2018-11-21 08:49:44
【问题描述】:

美好的一天。我正在做一个简单的演示,我需要将当前调用状态存储在数据库中。我在 onCreate 中使用此代码

telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

PhoneStateListener callStateListener = new PhoneStateListener() {
            public void onCallStateChanged(int state, String incomingNumber) {
                if (state == TelephonyManager.CALL_STATE_RINGING) {
                    Log.i(TAG, "onCallStateChanged: RING = "+state);

                        updateState(token, String.valueOf(state));

                }
                if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    Log.i(TAG, "onCallStateChanged: CALL = "+state);

                        updateState(token, String.valueOf(state));
                }

                if (state == TelephonyManager.CALL_STATE_IDLE) {
                    Log.i(TAG, "onCallStateChanged: IDLE = "+state);

                        updateState(token, String.valueOf(state));
                }
            }
        };
        telephonyManager.listen(callStateListener,PhoneStateListener.LISTEN_CALL_STATE);

奇怪的是,当它处于振铃状态时,它不会在 DB 中更新,而在摘机状态它会更新,但不会在通话后更新回空闲状态。 这是我的日志:

2018-11-21 14:23:59.225 1560-1560/? D/GpsNetInitiatedHandler: onCallStateChanged(): state is 0
2018-11-21 14:23:59.226 1560-1560/? D/RilInfoMonitor: onCallStateChanged(): state is 0
2018-11-21 14:23:59.227 16884-16884/com.aliaskarurakov.android.sendcall I/android.app.Activity: onCallStateChanged: IDLE = 0
2018-11-21 14:34:31.477 17892-17892/com.aliaskarurakov.android.sendcall I/android.app.Activity: onCallStateChanged: IDLE = 0
2018-11-21 14:35:33.606 17892-17892/com.aliaskarurakov.android.sendcall I/android.app.Activity: onCallStateChanged: RING = 1
2018-11-21 14:35:33.609 1560-1560/? D/GpsNetInitiatedHandler: onCallStateChanged(): state is 1
2018-11-21 14:35:33.609 1560-1560/? D/RilInfoMonitor: onCallStateChanged(): state is 1
2018-11-21 14:35:52.874 1560-1560/? D/GpsNetInitiatedHandler: onCallStateChanged(): state is 0
2018-11-21 14:35:52.876 17892-17892/com.aliaskarurakov.android.sendcall I/android.app.Activity: onCallStateChanged: IDLE = 0
2018-11-21 14:35:52.878 1560-1560/? D/RilInfoMonitor: onCallStateChanged(): state is 0
2018-11-21 14:36:01.375 1560-1560/? D/GpsNetInitiatedHandler: onCallStateChanged(): state is 2
2018-11-21 14:36:01.379 1560-1560/? D/RilInfoMonitor: onCallStateChanged(): state is 2
2018-11-21 14:36:01.382 17892-17892/com.aliaskarurakov.android.sendcall I/android.app.Activity: onCallStateChanged: CALL = 2
2018-11-21 14:36:19.502 1560-1560/? D/GpsNetInitiatedHandler: onCallStateChanged(): state is 0
2018-11-21 14:36:19.503 1560-1560/? D/RilInfoMonitor: onCallStateChanged(): state is 0

权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

【问题讨论】:

  • 您能提供更多信息吗?你的函数updateState() 是做什么的?
  • 您的 3 个ifs 是否有意不包含 if-elseif-elseif 结构或 switch-case 结构?
  • updateState() 将值发送到 DB。
  • 我用 switch-case 试过了,同样的问题
  • 你能解释一下你的日志吗?

标签: java android android-studio telephonymanager phone-state-listener


【解决方案1】:

不幸的是,我的日志看起来像同样的问题

小米手机

CallReceiver onCallStateChanged   state - 1
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 2
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0

三星手机

CallReceiver onCallStateChanged   state - 1
CallReceiver onCallStateChanged   state - 1
CallReceiver onCallStateChanged   state - 1
CallReceiver onCallStateChanged   state - 2
CallReceiver onCallStateChanged   state - 2
CallReceiver onCallStateChanged   state - 2
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0
CallReceiver onCallStateChanged   state - 0 

其中状态 1 = 振铃,2 =HookUp,0==空闲 我已经开始录制连接,但它立即停止在 xiomi 手机上(与三星 9 完美配合),因为它在连接后立即调用空闲状态,而不是等待用户切断通话

我发现我的错误实际上我在 onReceive() 中多次注册了 Listener,所以我将代码更改为仅初始化一次静态保留实例,如果不为空则下次使用它

       static phoneListener 
       if(phoneListener==null){
                phoneListener = PhoneCallStateListener(context, intent)
                val telephony = context
                        .getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE)
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多