I am trying to show the call log details in my app but CallLog.Calls.CACHED_NAME is always returning null for some contacts even if it is a saved contact with name. The built-in call log is showing the names for these contacts correctly.
This is my code:
protected customAdapRecent doInBackground(Void... params) {
ContentResolver resolver = context.getContentResolver();
final String[] PROJECTION = new String[] {
// CallLog.Calls.CACHED_LOOKUP_URI,
CallLog.Calls.NUMBER,
CallLog.Calls.CACHED_NAME,
CallLog.Calls.TYPE,
CallLog.Calls.DATE,
CallLog.Calls.DURATION
};
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, PROJECTION, null, null, CallLog.Calls.DATE + " DESC");
if(cursor.getCount() > 0)
{
int iNumber = cursor.getColumnIndex(CallLog.Calls.NUMBER);
int iName = cursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
int iType = cursor.getColumnIndex(CallLog.Calls.TYPE);
int iDate = cursor.getColumnIndex(CallLog.Calls.DATE);
int iDuration = cursor.getColumnIndex(CallLog.Calls.DURATION);
DateFormat datePattern = DateFormat.getDateInstance(DateFormat.FULL);
String number;
String name;
String type;
String date;
String duration;
String contactId;
String callIs = "None";
String prevDate = "";
int callType;
while (cursor.moveToNext())
{
if(cursor.getString(iName) == null)
Log.e("DEBUG: ", "Position: " + cursor.getPosition());
number = cursor.getString(iNumber);
name = cursor.getString(iName);
type = cursor.getString(iType);
String tempdate = cursor.getString(iDate);
Long tempDate = Long.parseLong(tempdate);
date = datePattern.format(tempDate);
if(prevDate.equalsIgnoreCase(date))
{
prevDate = date;
date = "";
}
else
prevDate = date;
//date = new Date(Long.valueOf(strdate));
duration = cursor.getString(iDuration);
callType = Integer.parseInt(type);
switch (callType)
{
case CallLog.Calls.OUTGOING_TYPE:
callIs = "OUT";
recentRow newRowO = new recentRow(number, name, date, duration, callIs);
listItem_recentOut.add(newRowO);
break;
case CallLog.Calls.INCOMING_TYPE:
callIs = "IN";
recentRow newRowI = new recentRow(number, name, date, duration, callIs);
listItem_recentIn.add(newRowI);
break;
case CallLog.Calls.MISSED_TYPE:
callIs = "MISS";
recentRow newRowM = new recentRow(number, name, date, duration, callIs);
listItem_recentMiss.add(newRowM);
break;
}
recentRow newRow = new recentRow(number, name, date, duration, callIs);
//recentRow newRow = new recentRow(number, name, callIs);
listItem_recentAll.add(newRow);
}
cursor.close();
cAdapRecent = new customAdapRecent(context, listItem_recentAll);
}
return cAdapRecent;
}
The Debug statement given in the Log.e() is also printing.
Am I doing something wrong in the lookup? Pls. suggest a way as I am really blocked due to this!
Thanks in advance...
I also came across this strange behavior and figured out that sometimes you can't get name of the contact immediately even though you can get everything else from the
CallLog.Calls
. What I noticed is that after approximately one hour or so since that call you can fetch name along with all otherCallLog.Calls
data. Very strange. If you need immediate refresh after call you can get name for the number fromContactsContract
like this:Strangely, after you fetch one name from the
ContactsContract
fetching name in the way you did it, through CallLog.Calls.CACHED_NAME, misteriously works.This is also answer for @PeterB and @shyam002