Retrieve contact image on Android

I am currently working on an android project where I am attempting to lookup a contact phone number in the device and retrieve the contact information such as contact name and contacts image. Getting the contract name is working fine, however, a null pointer is being thrown when trying to get the photo uri.

Below is the code I am using:

public ContactInformation getContactInfoFromPhoneNumber(String number)
    {
        ContactInformation contactInformation = new ContactInformation();
        if (number == null)
        {
            return null;
        }
        number = number.replace(" ", "");

        if (number.startsWith("+"))
        {
            number = number.substring(3);
        }

        ContentResolver contentResolver = context.getContentResolver();

        Uri uri = ContactsContract.Data.CONTENT_URI;
        String[] projection = new String[] {ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.DISPLAY_NAME};
        String selection = "REPLACE (" + ContactsContract.CommonDataKinds.Phone.NUMBER + ", " " , "" ) LIKE ?";
        String[] selectionArgs = { "%" + number };
        Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, null);

        if (cursor.moveToFirst())
        {
            contactInformation.contactName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
            contactInformation.photoUri = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            cursor.close();

            return contactInformation;
        }
        else
        {
            cursor.close();
            return null;
        }
    }

Thanks for any help you can provide.

UPDATE

Below is my updated code based on Itzik Samara answer.

Below is how I am doing my contact lookup

public ContactInformation getContactInfoFromPhoneNumber(String number)
    {
        ContactInformation contactInformation = new ContactInformation();
        if (number == null)
        {
            return null;
        }
        number = number.replace(" ", "");

        if (number.startsWith("+"))
        {
            number = number.substring(3);
        }

        ContentResolver contentResolver = context.getContentResolver();

        Uri uri = ContactsContract.Data.CONTENT_URI;
        String[] projection = new String[] {ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.DISPLAY_NAME};
        String selection = "REPLACE (" + ContactsContract.CommonDataKinds.Phone.NUMBER + ", " " , "" ) LIKE ?";
        String[] selectionArgs = { "%" + number };
        Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, null);

        if (cursor.moveToFirst())
        {
            contactInformation.contactName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
            contactInformation.photoBase64String = getContactPhoto(cursor.getInt(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)));
            cursor.close();

            return contactInformation;
        }
        else
        {
            cursor.close();
            return null;
        }
    }

Below is my getContactPhoto function

private String getContactPhoto(int contactID)
    {
        Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactID);
        Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        Cursor cursor = context.getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO},
                null, null, null);
        if (cursor == null)
        {
            return null;
        }
        if (cursor.getCount() > 0)
        {
            while (cursor.moveToNext()) {
                byte[] data = cursor.getBlob(0);
                String base64String = Base64.encodeToString(data, Base64.DEFAULT);
                cursor.close();
                return base64String;
            }
        }
        return null;
    }

Its failing on the if statement and jumping out of the if straight to return null as if there is nothing in the cursor.


这个功能适用于我:

private byte[] getContactPhoto(Context context,long contact_id) {

    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contact_id);
    Uri photoUri = Uri.withAppendedPath(contactUri,ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    Cursor cursor = context.getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
    if(cursor == null)
        return null;
    try {
        if(cursor.getCount() > 0) {
            if (cursor.moveToFirst()) {
                byte[] data = cursor.getBlob(0);
                cursor.close();
                if (data != null)
                    return data;
            }
        }

    }
    finally {
        cursor.close();
    }
    return null;
}




   private void getContacts(Context context) {

    ContentResolver cr = context.getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
    try {
        if (cursor.getCount() > 0) {

            while (cursor.moveToNext()) {

                long contact_id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                Contact friend = new Contact();
                String name= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String email = getContactEmail(context, contact_id);
                if(!name.contains("@") && !email.matches("")) {
                    friend.setName(name);
                    friend.setEmail(email);
                    friend.setImage(getContactPhoto(context, contact_id));
                    friend.setPhone(getContactMobilePhoneNumber(context, contact_id));

                    mContacts.add(friend);
                }
            }

        }
    }
    finally {
        cursor.close();
    }



}
链接地址: http://www.djcxy.com/p/31986.html

上一篇: 如何通过Uri值来捆绑价值

下一篇: 在Android上检索联系人图片