如何像其他应用程序一样更快地加载通话记录并像附加图像一样显示
How to load call logs faster like other apps and display like attached image
以下查询从设备加载当月的通话记录,对我来说,加载完成并存储到 sq-lite
数据库需要 2.5 to 3.5
秒
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 without PHOTO_URI
taking 2/3 seconds but still it taking 2/3 seconds and its more.
club_id
is a common id
for the sequential call made for particular number with the help of club_id
I am making count while deleting on long-press I am taking grouped logs
and its ID
to delete from DB
as well as from 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");
}
我试过不使用数据库,与上次上传的检查相比,它工作正常,速度更快。
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));
}
以下查询从设备加载当月的通话记录,对我来说,加载完成并存储到 sq-lite
数据库需要 2.5 to 3.5
秒
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");
}
我试过不使用数据库,与上次上传的检查相比,它工作正常,速度更快。
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));
}