Get contact name given a phone number in Android

I am trying to retrieve contact names given the contact phone number. I made a function that should work in all API versions, by I can’t make it work in 1.6 and I can’t see the problem, maybe someone can spot it?

Note that, I’ve replaced the API constants for strings so I don’t have deprecated warning problems.

  • Role of classes.dex file in an apk file
  • Moving MapFragment (SurfaceView) causes black background flickering
  • Simple way to do dynamic but square layout
  • Android Studio import class shortcut
  • Android HTML.fromHTML() with images?
  • Do Dalvik VM Processes Release System RAM?
  • public String getContactName(final String phoneNumber) 
    {  
        Uri uri;
        String[] projection;
    
        if (Build.VERSION.SDK_INT >= 5)
        {
            uri = Uri.parse("content://com.android.contacts/phone_lookup");
            projection = new String[] { "display_name" };
        }
        else
        { 
            uri = Uri.parse("content://contacts/phones/filter");
            projection = new String[] { "name" }; 
        } 
    
        uri = Uri.withAppendedPath(uri, Uri.encode(phoneNumber)); 
        Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 
    
        String contactName = "";
    
        if (cursor.moveToFirst()) 
        { 
            contactName = cursor.getString(0);
        } 
    
        cursor.close();
        cursor = null;
    
        return contactName; 
    }
    

  • Android custom permissions - Marshmallow
  • BitmapFactory.decodeStream out of memory despite using reduced sample size
  • Missing Up navigation icon after switching from ICS ActionBar to Lollipop Toolbar
  • ADT - libstdc++.so.6: cannot open shared object file
  • Android turn On/Off WiFi HotSpot programmatically
  • Custom Font in Android renders differently in different APIs
  • 4 Solutions collect form web for “Get contact name given a phone number in Android”

    Use reflections instead of comparing sdk version.

    public String getContactName(final String phoneNumber) 
    {  
        Uri uri;
        String[] projection;
        mBaseUri = Contacts.Phones.CONTENT_FILTER_URL;
        projection = new String[] { android.provider.Contacts.People.NAME }; 
        try {
            Class<?> c =Class.forName("android.provider.ContactsContract$PhoneLookup");
            mBaseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(mBaseUri);
            projection = new String[] { "display_name" };
        } 
        catch (Exception e) {
        }
    
    
        uri = Uri.withAppendedPath(mBaseUri, Uri.encode(phoneNumber)); 
        Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 
    
        String contactName = "";
    
        if (cursor.moveToFirst()) 
        { 
            contactName = cursor.getString(0);
        } 
    
        cursor.close();
        cursor = null;
    
        return contactName; 
    }
    

    This seems to work fine in the latest versions:

    private String getContactName(Context context, String number) {
    
        String name = null;
    
        // define the columns I want the query to return
        String[] projection = new String[] {
                ContactsContract.PhoneLookup.DISPLAY_NAME,
                ContactsContract.PhoneLookup._ID};
    
        // encode the phone number and build the filter URI
        Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    
        // query time
        Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null);
    
        if(cursor != null) {
            if (cursor.moveToFirst()) {
                name =      cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
                Log.v(TAG, "Started uploadcontactphoto: Contact Found @ " + number);            
                Log.v(TAG, "Started uploadcontactphoto: Contact name  = " + name);
            } else {
                Log.v(TAG, "Contact Not Found @ " + number);
            }
            cursor.close();
        }
        return name;
    }
    
     private String getContactNameFromNumber(String number) { 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    
    
    Cursor cursor = context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null);
    if (cursor.moveToFirst())
    {
        name = cursor.getString(cursor.getColumnIndex(PhoneLookup.D
    
    public static String getContactName(Context context, String phoneNumber)
    {
        ContentResolver cr = context.getContentResolver();
        Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
        Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);
        if (cursor == null)
        {
            return null;
        }
        String contactName = null;
        if(cursor.moveToFirst()) 
        {
            contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
        }
    
        if(cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    
        return contactName;
    }
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.