The Following query load call logs of current month from the device, for me, it's taking 2.5 to 3.5
seconds to load complete and store into sq-lite
database
CallLogHelper Class
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 class Here I am making some database operations with call logs, for the execution of code it's taking 7 s with
PHOTO_URI
which is loading from another cursor and withoutPHOTO_URI
taking 2/3 seconds but still it taking 2/3 seconds and its more.
club_id
is a commonid
for the sequential call made for particular number with the help ofclub_id
I am making count while deleting on long-press I am takinggrouped logs
and itsID
to delete fromDB
as well as fromdevice
.
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");
}
I have tried without using data base its working fine and more faster as compare to last uploaded check following answer.
But I have issue with Name and photo uri of call log because Cached data may not be available or may not be updated after any contact changed. Is their any Other way to deal with it.
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));
}