разграничете изходящите повиквания с отговор и без отговор

Искам да разбера дали е отговорено на изходящо повикване. За съжаление, в случай на изходящо повикване виждам

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