android - 使用服务获取 CallLog 上的最后一次通话

标签 android android-service android-contentresolver telephonymanager 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 change执行方法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,它会在通话记录中发生任何更改时通知您,即如果新通话添加到通话记录或您删除了通话记录

编辑

尝试在通话结束后获取新的通话记录我用这段代码得到了正确的结果

通话结束后等待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)

关于android - 使用服务获取 CallLog 上的最后一次通话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068418/

相关文章:

java - 需要帮助显示 Web 服务的 SOAP 请求的返回

android - Google Play 游戏服务的登录问题

android - 根据 Activity 的广播接收器更新 fragment ui

android - 使用单例与 Android 服务对话

android - 使用 contentResolver 删除短信太慢

android - 在 Android 中将原始资源设置为铃声

android - 无法从远程机器(Android 设备)连接到 RabbitMQ 服务器

java - Android 服务创建单例类的新实例

java - 使用 ContentResolver 和 openInputStream() (Android)

android - 错误膨胀类 com.google.android.material.bottomnavigation.BottomNavigationView