android PhoneStateListener onCallStateChanged strange behaviour

819 Views Asked by At

Good day. I'm doing simple demo where i need to store current call state in DB. I'm using this code in 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);

Strange thing is when it is in ringing state it doesn't updates in DB and in offhook state it updates but doesn't updates back to idle after the call. This is my log:

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

permissions:

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

There are 1 best solutions below

0
On

Unfortunately i am facing same problem my log look like

Xiomi Mobile

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

Samsung mobile

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 

Where state 1 = Ringing, 2 =HookUp , 0==Idle I have start recording on hookup but it immediately stop on xiomi mobile(work perfectly with Samsung 9) because it it call idle state immediately after hookup and not wait for user to cut the call

I found my mistake actually i am registering Listener multiple time in onReceive() so I change my code to to initialize only one time preserve instance statically and use it next time if not null

       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)
        }