CallLog.Calls.CACHED_NAME is always returning null for some saved contacts

1.1k views Asked by At

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...

1

There are 1 answers

0
tompadre On

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 other CallLog.Calls data. Very strange. If you need immediate refresh after call you can get name for the number from ContactsContract like this:

 fun getNameForNumber(context: Context, number: String): String? {

        var res: String? = null
        try {
            val resolver = context.contentResolver
            val uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number))
            val c = resolver.query(uri, arrayOf(ContactsContract.PhoneLookup.DISPLAY_NAME), null, null, null)

            if (c != null) {
                if (c.moveToFirst()) {
                    res = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                }
                c.close()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return res
    }

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