【问题标题】:How to load call logs faster like other apps and display like attached image如何像其他应用程序一样更快地加载通话记录并像附加图像一样显示
【发布时间】:2017-09-14 12:31:04
【问题描述】:

以下查询从设备加载当前月份的调用日志,对我来说,加载完成并存储到 sq-lite 数据库需要 2.5 to 3.5

CallLogHelper 类

      public static Cursor getAllCallLogs(ContentResolver cr) {
          String[] PROJECTION = new String[]{
            CallLog.Calls.NUMBER,
            CallLog.Calls._ID,
            CallLog.Calls.CACHED_NAME,
            CallLog.Calls.DATE,
            CallLog.Calls.TYPE,
            CallLog.Calls.DURATION};
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MONTH, -1);
    Date weekBefore = calendar.getTime();
    String strClause = CallLog.Calls.DATE + " >= ?";
    String[] strValues = {String.valueOf(weekBefore.getTime())};
    String strOrder = CallLog.Calls.DATE + " DESC limit 500";
    Cursor curCalls = cr.query(CallLog.Calls.CONTENT_URI, PROJECTION, strClause,
            strValues, strOrder);
    return curCalls;  }

CallLogLoaderServicel 类 在这里,我正在使用调用日志进行一些数据库操作,执行代码需要 7 秒,其中 PHOTO_URI 从另一个游标加载,而没有 PHOTO_URI 需要 2/3 秒,但仍然需要 2/3 秒及其更多。

club_id 是常见的id,用于在club_id 的帮助下对特定号码进行连续调用来自DB 以及来自device

private void setCallLogs(Cursor curLog) {
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
    logsqLiteDatabase.beginTransaction();
    for (curLog.moveToLast(); !curLog.isBeforeFirst(); curLog.moveToPrevious()) {
        String callNumber = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.NUMBER));
        callNumber = Utilities.correctNumber(callNumber);
        String ids = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls._ID));

        String name = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.CACHED_NAME));

        String callname = "Unknown";
        try {
            if (name != null)
                callname = name;

        } catch (Exception e) {
            e.printStackTrace();
        }


        String callType = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.TYPE));

        String duration = "";

        ***//with pic 7 second
        //withought pic uri 5/6 second***

        String photoUri = "";
      /*  if (callNumber != null) {
            photoUri = Utilities_dialer.getContactPhoto(this, callNumber);
        }*/

        String dateString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                .format(new Date(Long
                        .parseLong(curLog.getString(curLog.getColumnIndex(CallLog.Calls.DATE)))));

        if (log_db_Handler.getLogCount() == 0) {
            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                    , duration, String.valueOf(count), todayis, "1");

        } else {
            Cursor readContact = log_db_Handler.readLastCallLogs();
         //   if (readContact.moveToLast()) {
                String phone = readContact.getString(readContact.getColumnIndex(DatabaseHandler.KEY_PH_NO));

                if (phone.equals(callNumber.replace(" ", ""))) {
                    String type = readContact.getString(readContact.getColumnIndex(DatabaseHandler.KEY_TYPE));

                    club_id = readContact.getString(readContact.getColumnIndex(DialerDatabaseHandler.KEY_CLUB_ID));
                    int c_id = Integer.parseInt(club_id);
                    if (type.equals(callType)) {

                        log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                    } else {

                        if (type.equals("3") && (callType.equals("10") || callType.equals("2") || callType.equals("1"))) {

                            c_id = c_id + 1;

                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        } else if ((type.equals("10") || type.equals("2") || type.equals("1")) && callType.equals("3")) {

                            c_id = c_id + 1;

                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        } else {


                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        }
                    }

                } else {
                    club_id = readContact.getString(readContact.getColumnIndex(DialerDatabaseHandler.KEY_CLUB_ID));
                    int c_id = Integer.parseInt(club_id);
                    c_id = c_id + 1;
                    log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                            , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                }
           // }
            readContact.close();

        }
    }
    logsqLiteDatabase.setTransactionSuccessful();
    logsqLiteDatabase.endTransaction();
    curLog.close();
    endTime = System.currentTimeMillis();
    long MethodeDuration = (endTime - startTime);
    Log.e("MethodeDuration", "-log-" + MethodeDuration);

    Intent intent = new Intent("log_updated");
    sendBroadcast(intent);
    smartCallPreference.setLogFirstTime("1");
}

【问题讨论】:

    标签: contacts calllog


    【解决方案1】:

    我尝试过不使用数据库,与上次上传的检查结果相比,它的工作正常且速度更快。

    但我对通话记录的姓名和照片 uri 有疑问,因为缓存数据可能不可用,或者在任何联系人更改后可能不会更新。他们有没有其他方法来处理它。

     private void setCallLogs(Cursor curLog) {
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
        int sr_id = 0;
        while (curLog.moveToNext()) {
            String callNumber = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.NUMBER));
            callNumber = Utilities.correctNumber(callNumber);
            String ids = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls._ID));
    
            String name = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.CACHED_NAME));
    
            String callname = "Unknown";
            String photoUri = "";
            if (name != null)
                callname = name;
    
    
            String callType = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.TYPE));
    
            String dateString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                    .format(new Date(Long
                            .parseLong(curLog.getString(curLog.getColumnIndex(CallLog.Calls.DATE)))));
            //dateString = CallHistoryFragment.setdateToLog(dateString);
    
            sr_id = sr_id + 1;
            if (mainDialerhistory.size() == 0) {
    
                club_id = 1;
                count = 1;
    
                mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                        callType, "", "", count, photoUri, String.valueOf(club_id)));
    
            } else {
                count = 0;
                int mainArraySize = mainDialerhistory.size() - 1;
                if (mainDialerhistory.get(mainArraySize).getPhone().equals(callNumber.replace(" ", ""))) {
    
                    if (mainDialerhistory.get(mainArraySize).getcallType().equals(callType)) {
                        count = mainDialerhistory.get(mainArraySize).getCount() + 1;
                        club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id());
    
                        mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                callType, "", "", count, photoUri, String.valueOf(club_id)));
    
                    } else {
                        String lastType = mainDialerhistory.get(mainArraySize).getcallType();
    
                        if (lastType.equals("3") && (callType.equals("10") || callType.equals("2") || callType.equals("1"))) {
                            count = 0;
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", 1, photoUri, String.valueOf(club_id)));
    
                        } else if ((lastType.equals("10") || lastType.equals("2") || lastType.equals("1")) && callType.equals("3")) {
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", count + 1, photoUri, String.valueOf(club_id)));
    
                        } else {
                            count = 0;
                            count = mainDialerhistory.get(mainArraySize).getCount() + 1;
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id());
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", count, photoUri, String.valueOf(club_id)));
    
                        }
                    }
                } else {
                    club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
                    mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                            callType, "", "", 1, photoUri, String.valueOf(club_id)));
    
                }
            }
    
        }
        curLog.close();
        endTime = System.currentTimeMillis();
        long MethodeDuration = (endTime - startTime);
        Log.e("MethodeDuration", "-count-" + mainDialerhistory.size());
        Log.e("MethodeDuration", "-log-" + MethodeDuration);
        AccountController.getInstance().mAccountHistory.addAll(mainDialerhistory);
    
        sendBroadcast(new Intent("log_updated"));
    
    
        stopService(new Intent(this, CallLogIntentService.class));
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2022-11-13
      • 2016-02-08
      相关资源
      最近更新 更多