【问题标题】:How do I get the latest call logs in Android Studio?如何在 Android Studio 中获取最新的通话记录?
【发布时间】:2019-08-01 16:53:28
【问题描述】:

我有一个可以在下面使用的代码。但我不能限制它。我只想获取最近的 20 个通话记录。 但这就是我看到所有时间搜索日志的方式。

应该只是最后的通话记录,我只需要看20条。任何帮助,我将不胜感激。

我的代码;

private void getCallLogs() {

        ContentResolver cr = getBaseContext().getContentResolver();
        Cursor c = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, null);
        int totalCall = 1;
        if (c != null) {
            totalCall = c.getCount();
            if (c.moveToFirst()) {
                for (int j = 0; j < totalCall; j++) {

                    String callDate = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.DATE));
                    String phNumber = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.NUMBER));
                    String callDuration = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.DURATION));
                    Date dateFormat= new Date(Long.valueOf(callDate));
                    String callDayTimes = String.valueOf(dateFormat);
                    String direction = null;

                    switch (Integer.parseInt(c.getString(c.getColumnIndexOrThrow(CallLog.Calls.TYPE)))) {
                        case Telephony.Sms.MESSAGE_TYPE_INBOX:
                            direction = "OUTGOING";
                            break;
                        case Telephony.Sms.MESSAGE_TYPE_SENT:
                            direction = "INGOING";
                            break;
                        case Telephony.Sms.MESSAGE_TYPE_OUTBOX:
                            direction = "MISSED";
                            break;
                        default:
                            break;
                    }

                    Toast.makeText(this, phNumber + direction + callDuration + callDayTimes, Toast.LENGTH_SHORT).show();
                }
            }
            c.close();
        }
    }

【问题讨论】:

  • 你的 for 循环正在使用 totalCall 为什么不把它改成 20 呢?
  • totalCall = 20 如果这不起作用,请向我们展示您的尝试并解释发生了什么。
  • 可以的。但是 for 循环的本质是什么? :/ 它更像是什么都不做,还是我错过了什么?
  • 我只是说不需要 for 循环。尽管您的代码现在可以工作,但删除它不会有任何区别,因为它甚至会在应用程序上增加额外的负载。
  • 您可以在您的帖子中添加编辑或回复您的答案,让其他有类似问题的冲浪者知道它是如何解决的。

标签: android android-cursor telephonymanager calllog


【解决方案1】:

请在您的清单文件中添加此权限。

<uses-permission android:name="android.permission.READ_CALL_LOG"/>

在你的 Activity 文件中添加这个函数并在 oncreate 函数中调用它。

 public void getCallLogs() {            
        int flag=1;
        title.setText(Html.fromHtml("<b>Call Logs</b>"));
        deviceDetails.setText(Html.fromHtml(""));
        StringBuilder callLogs = new StringBuilder();

        ArrayList<String> calllogsBuffer = new ArrayList<String>();
        calllogsBuffer.clear();
        Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI,
                null, null, null, null);
        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);
        while (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;
            }
            calllogsBuffer.add("\nPhone Number: " + phNumber + " \nCall Type: "
                    + dir + " \nCall Date: " + callDayTime
                    + " \nCall duration in sec : " + callDuration + "\n");

        }
        managedCursor.close();
}

要调用此函数,请将其添加到 Activity 中的 oncreate 函数中。

getCallLogs();

【讨论】:

  • 天哪。我在 6 个月前问过这个问题,我有一个解决方案。我在上面添加了答案。不过,您的答案看起来不错,并且与我的相似。我相信它会起作用,我将其标记为答案。感谢您的关注。
【解决方案2】:

在这里,我们可以使用我们已经创建的 for 循环创建一个整数,并在此处设置一个限制。

我很抱歉我的英语不好。

功能;

private void getCallLogs() {

    ContentResolver cr = getBaseContext().getContentResolver();
    Cursor c = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, null);

    int totalCall = 1;

    if (c != null) {
        totalCall = 10; // intenger call log limit

        if (c.moveToLast()) { //starts pulling logs from last - you can use moveToFirst() for first logs
            for (int j = 0; j < totalCall; j++) {


                String phNumber = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.NUMBER));
                String callDate = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.DATE));
                String callDuration = c.getString(c.getColumnIndexOrThrow(CallLog.Calls.DURATION));
                Date dateFormat= new Date(Long.valueOf(callDate));
                String callDayTimes = String.valueOf(dateFormat);

                String direction = null;
                switch (Integer.parseInt(c.getString(c.getColumnIndexOrThrow(CallLog.Calls.TYPE)))) {
                    case CallLog.Calls.OUTGOING_TYPE:
                        direction = "OUTGOING";
                        break;
                    case CallLog.Calls.INCOMING_TYPE:
                        direction = "INCOMING";
                        break;
                    case CallLog.Calls.MISSED_TYPE:
                        direction = "MISSED";
                        break;
                    default:
                        break;
                }

                c.moveToPrevious(); // if you used moveToFirst() for first logs, you should this line to moveToNext

                Toast.makeText(getBaseContext(), phNumber + callDuration + callDayTimes + direction, Toast.LENGTH_SHORT).show(); // you can use strings in this line 

            }
        }
        c.close();
    }
}

【讨论】:

  • 2 cmets:(1) 调用的默认排序顺序是“日期 DESC”,因此要获取最后 10 个调用,您应该查询 first 10 个光标行。 (2) 如果调用日志中的 10 个调用少于此代码可能会崩溃,则循环应为 while (c.moveToNext() &amp;&amp; j &lt; totalCalls),然后手动递增 j
  • @marmor 不确定您是否没看错,但如果我更改为moveToFirst() 和moveToNext(),Lollipop 5.1 OnePlus X 将为我提供六月日志...仅限@987654326 @ 和 moveToPrevious() 让我今天的日志。不过,while 的事情是个好主意。但不要独处,因为它会错过最后的日志。必须是一个do-while,就是你所说的while语句。
  • @DADi590 由于排序顺序,您首先收到较旧的呼叫,请参阅我的评论 #1 - 您需要指定排序日期 DESC 以使最后的呼叫首先出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多