различать отвеченные и неотвеченные исходящие вызовы

Я хочу узнать, был ли ответ на исходящий вызов. К сожалению, в случае исходящего вызова я вижу

Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } extras:Bundle{ state => OFFHOOK; }Bundle
Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } extras:Bundle{ state => IDLE; }Bundle

независимо от того, был ли ответ на вызов.

Как определить, что исходящий вызов принят? (Пожалуйста, как для рутированных, так и для нерутированных устройств.)


person 18446744073709551615    schedule 03.03.2015    source источник


Ответы (1)


В Android вы не можете различать отвеченные и неотвеченные исходящие вызовы с помощью намерения (но доступно на ios).

Мой обходной путь: проверьте журнал приложения телефона (см. CallLog.Calls), если журнал исходящих вызовов больше 0, значит, на него ответили.

    public static final int TIME_TO_WAIT_PHONE_LOG_UPDATE_MILISECOND = 2000;
    public static final int PHONE_CALL_SUCCESS = 0x00; // answered
    public static final int PHONE_CALL_FAILED = 0x01; // unanswered

//

private class PhoneCallListener extends PhoneStateListener {

            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
                    // Calling not picked up
                    // Đang gọi chưa nhấc máy
                    Log.i(DEBUG_TAG, "OFFHOOK, num = " + incomingNumber);
                    isCalling = true;
                }

                if (TelephonyManager.CALL_STATE_IDLE == state) {
                    if (isCalling) {
                        // close
                        // Kết Thúc
                        Log.v(DEBUG_TAG, "CALL_STATE_IDLE, num = " + incomingNumber);
                        isCalling = false;

                        // Read the log to see if the other party can hear the machine or not
                        // Đọc log xem thử bên kia có nghe máy hay không
                        new Handler().postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                int result = getCallDetails();

                                if (mOnCallFinishListener != null) {
                                    mOnCallFinishListener.onCallFinish(supporter, result);
                                }
                            }
                        }, MikeMikeConfig.TIME_TO_WAIT_PHONE_LOG_UPDATE_MILISECOND);
                    }
                }
            }
        }

private int getCallDetails() { 
            int ret = 0;

            StringBuffer sb = new StringBuffer();
            Cursor managedCursor = activity.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, /*null*/ CallLog.Calls.DEFAULT_SORT_ORDER);
            // on some phones (e.g. LG) null does not mean DEFAULT_SORT_ORDER which is "date DESC"
            int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
            int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
            int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); 
            int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
            sb.append("Call Log :"); 
            //while (managedCursor.moveToNext()) { 
                managedCursor.moveToNext();
                String phNumber = managedCursor.getString(number);
                String callType = managedCursor.getString(type); 
                String callDate = managedCursor.getString(date); 
                Date callDayTime = new Date(Long.valueOf(callDate)); 
                String callDuration = managedCursor.getString(duration); 
                String dir = null; int dircode = Integer.parseInt(callType);
                switch (dircode) { 
                case CallLog.Calls.OUTGOING_TYPE:
                    dir = "OUTGOING"; 
                    break; 
                case CallLog.Calls.INCOMING_TYPE: 
                        dir = "INCOMING"; 
                        break;
                case CallLog.Calls.MISSED_TYPE: 
                    dir = "MISSED"; 
                    break; 
                } 

                sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); sb.append("\n----------------------------------");
            //} //managedCursor.close(); textView.setText(sb); } 

            //Log.v(DEBUG_TAG, sb + "");

                int call_duration = Integer.parseInt(callDuration);
                Log.v(DEBUG_TAG, "duration = " + call_duration);


                if (call_duration > 0) ret = MikeMikeConfig.PHONE_CALL_SUCCESS;

                if (call_duration == 0) ret = MikeMikeConfig.PHONE_CALL_FAILED;

                return ret;
        }
person cxphong    schedule 03.03.2015
comment
Попробовал, работает, НО: на моем телефоне последний звонок последний в наборе данных курсора . У меня нет оснований полагать, что это было не первое на вашем телефоне. - person 18446744073709551615; 04.03.2015
comment
Чтобы упорядочить вызовы правильно, я указал CallLog.Calls.DEFAULT_SORT_ORDER в mService.getContentResolver().query(CALLOG_URI, null, null, null, CallLog.Calls.DEFAULT_SORT_ORDER), это работает, потому что DEFAULT_SORT_ORDER задокументировано как "date DESC". Совершенно непонятно, почему порядок сортировки по умолчанию на null не DEFAULT_SORT_ORDER, но так оно и есть. (также редактируя ответ) - person 18446744073709551615; 04.03.2015
comment
Еще одно замечание: я зарегистрировал ContentObserver и получил курсор из метода onChange(). - person 18446744073709551615; 04.03.2015