質問

いくつかはプログラムを送信するCallLogサーバーに作ったサービスにより、投票の電話状況は以下の方法です。このメソッドが呼び出される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);
}

の方法CallEnd、チェックの場合、通話が始まれば、その場合はその期間のこの呼び出しのCallLogに使っている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();
    }
}

ま貼り付け方法にgetDurationまでの期間中にお電話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あく、前回の通話時間にわた各前ます。した待ち時間も受けている。

---編集---

私のコードを使用ContentObserverが、今ではもうほとんど同じ結果です。のようなオブザーバの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変更を実行する方法getDuration、新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;
}

の期間、前回の通話を継続間違っているのは、この期間は前ます。わからないと思います。

役に立ちましたか?

解決

追加ContentObserverに話しています何かが変更となりますcallLogる新しく通話が通話履歴は削除され、通話履歴

編集

うした話後に通話が終了してい右結果を出すことができコード

待ちに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