문제

전화를 걸어 서버로 콜로그를 보내려면 다음과 같은 방법으로 전화 상태를 폴링하는 서비스를 만들었습니다. 이 방법을 OnCreate라고합니다.

private void pollForCallStatus() {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Log.d("Poll", Integer.toString(telephonyManager.getCallState()));
            switch (telephonyManager.getCallState()){
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.d("CallService", "ringing");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    callStart();
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    callEnd();
                    break;
            }
        }
    }, 0, 1000);
}
.

메서드 콜 엔드, 통화가 시작되었는지 확인하고,이 케이스가 콜로그 의이 호출 기간을 가져 오는 경우, 발신 호출이 시작될 때 결정할 수 없기 때문에 calllog를 사용합니다.

private void callEnd() {
    if (isStart) {
        Log.d("CallService", "callEnd");
        Integer duration = getDuration();
        Log.d("CallService", duration.toString());
        Command sender = new SendCall(this.phoneNumber, duration);
        isStart = false;
        this.stopSelf();
    }
}
.

메소드 게시 쿼터리를 붙여 넣었습니다. Calllog에서 통화 기간을 가져 오기 위해 사용했습니다.

private Integer getDuration(){
    Integer duration = 0;
    callLogCursor.moveToFirst();
    if ( phoneNumber.equalsIgnoreCase(callLogCursor.getString(callLogCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
        duration = callLogCursor.getInt(callLogCursor.getColumnIndex(CallLog.Calls.DURATION));
    return duration;
}
.

내 문제는 이전 호출을 받아 들일 때에도 불구하고 getduration이 마지막 전화 지속 시간을 가져 오지 않는다는 것입니다. 나는 더 많은 시간을 기다리려고했지만, 나는 같은 결과를 받는다.

--- 편집 ---

ContentBserver를 사용하도록 코드를 변경했지만 동일한 결과가 있습니다. BroadCastReceiver

에 관찰자를 만듭니다.
public class CallsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

         ContentResolver cr = context.getContentResolver();
         Cursor callLogCursor = cr.query(android.provider.CallLog.Calls.CONTENT_URI,
            null,
            null,
            null,
            android.provider.CallLog.Calls.DEFAULT_SORT_ORDER /*sort by*/);

         Command sender = new SendCall(phoneNumber, callLogCursor);
         context.getContentResolver().
            registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
            true, new CallObserver(context, sender));
    }
}
.

Calllog Change가 메소드 GetDuration을 실행하면 새 게재}은

입니다.
private Integer getDuration(){
    Integer duration = 0;
    callCursor.moveToFirst();
    if ( phoneNumber.equalsIgnoreCase(callCursor.getString(callCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
        duration = callCursor.getInt(callCursor.getColumnIndex(CallLog.Calls.DURATION));

    Log.d("SendCall.getDuration", duration.toString());
    return duration;
}
.

및 마지막 통화 기간이 계속 되므로이 기간은 이전 호출입니다. 나는 그것을 할 수 있다는 것을 모른다.

도움이 되었습니까?

해결책

Calllog I.E.에 대한 모든 것이 변경 될 때 알림을 통화하는 통화 로그에 ContentObserver를 추가합니다. 새 통화가 호출 로그에 추가되거나 통화 로그를 제거한 경우

편집

이 코드가 완료되면이 코드로 올바른 결과를 얻는 후 새 통화 로그 가져 오기

콜 마감 후 3-4 초 동안 기다린 다음

CursorLoader cursorLoader = new CursorLoader(mActivity,
            CallLog.Calls.CONTENT_URI, null, null, null, null);
managedCursor = cursorLoader.loadInBackground();


int durationIndex = managedCursor.getColumnIndex(CallLog.Calls.DURATION);

managedCursor.moveToFirst();

String duration =managedCursor.getString(duration)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top