Pergunta

Estou tendo problemas para carregar uma foto para um contato no Android. Pesquisei no Google para uma resposta, mas até agora ficou vazio. Alguém tem um exemplo de consulta para um contato e depois carregar a foto?

Então, dado um contacturi que vem de um resultado de atividade chamado usando

startActivityForResult(new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI),PICK_CONTACT_REQUEST) 

é:

Conteúdo: //com.android.contacts/data/1557

O LoadContact (..) funciona bem. No entanto, quando eu chamo o método getphoto (...), recebo um valor nulo para o InputStream de entrada. Também é confuso porque os valores de URI são diferentes. O ContactPhoTouri avalia para:

Conteúdo: //com.android.contacts/contacts/1557

Veja os comentários em linha no código abaixo.

 class ContactAccessor {

    /**
     * Retrieves the contact information.
     */
    public ContactInfo loadContact(ContentResolver contentResolver, Uri contactUri) {

        //contactUri --> content://com.android.contacts/data/1557

        ContactInfo contactInfo = new ContactInfo();

        // Load the display name for the specified person
        Cursor cursor = contentResolver.query(contactUri,
                                            new String[]{Contacts._ID, 
                                                         Contacts.DISPLAY_NAME, 
                                                         Phone.NUMBER,
                                                         Contacts.PHOTO_ID}, null, null, null);
        try {
            if (cursor.moveToFirst()) {
                contactInfo.setId(cursor.getLong(0));
                contactInfo.setDisplayName(cursor.getString(1));
                contactInfo.setPhoneNumber(cursor.getString(2));
            }
        } finally {
            cursor.close();
        }        
        return contactInfo;  // <-- returns info for contact
    }

    public Bitmap getPhoto(ContentResolver contentResolver, Long contactId) {
        Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);

        // contactPhotoUri --> content://com.android.contacts/contacts/1557

        InputStream photoDataStream = Contacts.openContactPhotoInputStream(contentResolver,contactPhotoUri); // <-- always null
        Bitmap photo = BitmapFactory.decodeStream(photoDataStream);
        return photo;
    }

    public class ContactInfo {

        private long id;
        private String displayName;
        private String phoneNumber;
        private Uri photoUri;

        public void setDisplayName(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public Uri getPhotoUri() {
            return this.photoUri;
        }

        public void setPhotoUri(Uri photoUri) {
            this.photoUri = photoUri;
        }

        public long getId() {
            return this.id;
        }

        public void setId(long id) {
            this.id = id;
        }

    }
}

Claramente, estou fazendo algo errado aqui, mas não consigo descobrir qual é o problema. Obrigado.

Foi útil?

Solução

Tendo digitalizado as muitas perguntas e respostas para o problema de exibir uma miniatura, pensei em postar minha solução para esse enigma em particular, pois só conseguia encontrar um casal que funcionasse e nenhum que fornecia uma boa solução enlatada para o desenvolvedor preguiçoso.

A aula abaixo leva um contexto, o QuickContactBadge e um número de telefone e anexará uma imagem armazenada localmente ao crachá se houver um disponível para o número de telefone especificado.

Aqui está a aula:

public final class QuickContactHelper {

private static final String[] PHOTO_ID_PROJECTION = new String[] {
    ContactsContract.Contacts.PHOTO_ID
};

private static final String[] PHOTO_BITMAP_PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Photo.PHOTO
};

private final QuickContactBadge badge;

private final String phoneNumber;

private final ContentResolver contentResolver;

public QuickContactHelper(final Context context, final QuickContactBadge badge, final String phoneNumber) {

    this.badge = badge;
    this.phoneNumber = phoneNumber;
    contentResolver = context.getContentResolver();

}

public void addThumbnail() {

    final Integer thumbnailId = fetchThumbnailId();
    if (thumbnailId != null) {
        final Bitmap thumbnail = fetchThumbnail(thumbnailId);
        if (thumbnail != null) {
            badge.setImageBitmap(thumbnail);
        }
    }

}

private Integer fetchThumbnailId() {

    final Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    final Cursor cursor = contentResolver.query(uri, PHOTO_ID_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

    try {
        Integer thumbnailId = null;
        if (cursor.moveToFirst()) {
            thumbnailId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
        }
        return thumbnailId;
    }
    finally {
        cursor.close();
    }

}

final Bitmap fetchThumbnail(final int thumbnailId) {

    final Uri uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, thumbnailId);
    final Cursor cursor = contentResolver.query(uri, PHOTO_BITMAP_PROJECTION, null, null, null);

    try {
        Bitmap thumbnail = null;
        if (cursor.moveToFirst()) {
            final byte[] thumbnailBytes = cursor.getBlob(0);
            if (thumbnailBytes != null) {
                thumbnail = BitmapFactory.decodeByteArray(thumbnailBytes, 0, thumbnailBytes.length);
            }
        }
        return thumbnail;
    }
    finally {
        cursor.close();
    }

}

}

E aqui está um estojo de uso típico dentro de uma atividade:

String phoneNumber = "...";
QuickContactBadge badge = (QuickContactBadge) view.findViewById(R.id.friend);
new QuickContactHelper(this, badge, phoneNumber).addThumbnail();

Em um fragmento, será um pouco diferente:

String phoneNumber = "...";
QuickContactBadge badge = (QuickContactBadge) view.findViewById(R.id.friend);
new QuickContactHelper(getActivity(), badge, phoneNumber).addThumbnail();

Agora, existem maneiras de ser mais eficiente- por exemplo Recuperando o bitmap - mas meu objetivo aqui era postar uma solução que é despojada no mínimo absoluto para maior clareza e, ao mesmo tempo, fornece uma solução completa e utilizável fora da caixa. Esta solução foi construída e testada no Andriod 4.0 e testada em 4.1 também.

Outras dicas

Isso funciona para mim:

public static Bitmap loadContactPhoto(ContentResolver cr, long  id) {
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
    if (input == null) {
        return null;
    }
    return BitmapFactory.decodeStream(input);
}

Gente, passei muitas horas tentando descobrir isso. Aqui está um método que eu criei que lhe dará sua foto do Facebook por número de telefone (sem traços). Você pode, é claro, modificá -lo de acordo:

    public Bitmap getFacebookPhoto(String phoneNumber) {
    Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Uri photoUri = null;
    ContentResolver cr = this.getContentResolver();
    Cursor contact = cr.query(phoneUri,
            new String[] { ContactsContract.Contacts._ID }, null, null, null);

    if (contact.moveToFirst()) {
        long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);

    }
    else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    if (photoUri != null) {
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(
                cr, photoUri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        }
    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
    return defaultPhoto;
}

Depois de muitas noites de depuração, descubro que a melhor abordagem é usar o contact id e se não conseguir usar o photo id.

public static Bitmap loadContactPhoto(ContentResolver cr, long  id,long photo_id) 
{

    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
    if (input != null) 
    {
        return BitmapFactory.decodeStream(input);
    }
    else
    {
        Log.d("PHOTO","first try failed to load photo");

    }

    byte[] photoBytes = null;

    Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photo_id);

    Cursor c = cr.query(photoUri, new String[] {ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);

    try 
    {
        if (c.moveToFirst()) 
            photoBytes = c.getBlob(0);

    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();

    } finally {

        c.close();
    }           

    if (photoBytes != null)
        return BitmapFactory.decodeByteArray(photoBytes,0,photoBytes.length);
    else
        Log.d("PHOTO","second try also failed");
    return null;
}

O código testado no emulador e no dispositivo Nexus e parece funcionar.

Nenhuma dessas abordagens funcionou para mim. O que funcionou foi:

String[] projection = new String[] {
                ContactsContract.Contacts.PHOTO_ID,                 ///< the correct ID for photo retrieval in loadLocalContactPhotoBytes()
//              ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
//              ContactsContract.CommonDataKinds.Photo.PHOTO
        };

        ContentResolver cr = ctx.getContentResolver();

        Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                //      Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
                //              new String[] {RawContacts._ID, RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME},
                //              new String[] {Contacts._ID},
                projection, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

....

// O 'cursor' acima foi passado como um argumento abaixo

    private byte[] loadLocalContactPhotoBytes(ContentResolver cr, Cursor cursor, byte[] defaultPhotoBytes)
    {
        byte[] photoBytes = null;// = cursor.getBlob(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO));

//      int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
//      Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
//      Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);

        Cursor c = cr.query(photoUri, new String[] {ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);

        try 
        {
            if (c.moveToFirst()) 
                photoBytes = c.getBlob(0);

        } catch (Exception e) {
            // TODO: handle exception
            Log.w(_TAG, e.toString());

        } finally {

            c.close();
        }           

        photoBytes = photoBytes == null ? defaultPhotoBytes : photoBytes;
        return photoBytes;
    }

Apenas para chutes, copiei a maioria das respostas aqui em uma única classe para ver se algum deles conseguiria obter a miniatura do Facebook. Eles não fizeram ... mas, aqui está o que eu fiz para talvez salvá -lo fazendo o mesmo.

Ele mostra os resultados em uma caixa de diálogo para facilitar.

Por favor, esteja ciente - Não está otimizado e você precisará pegar erros e fechar cursores etc.:

Para iniciar a intenção do seletor de contato:

private static final int SELECT_CONTACT = 1468;

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
contactPickerIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

try {
    startActivityForResult(contactPickerIntent, SELECT_CONTACT);
} catch (ActivityNotFoundException e) {
    e.printStackTrace();
}

O retorno de chamada:

@Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

    if (data != null && resultCode == Activity.RESULT_OK) {

        switch (requestCode) {

        case SELECT_CONTACT:

            Uri contactURI = data.getData();

            if (contactURI != null) {

                String contactID = data.getData().getLastPathSegment().trim();

                String contactName = ContactThumb.getDisplayName(getActivity(), contactURI);

                if (contactName != null && !contactName.isEmpty() && contactID != null && !contactID.isEmpty()) {

                    final int THUMBNAIL_SIZE = 100;

                    Bitmap contactThumb = ContactThumb.loadContactPhoto(getActivity(), Long.valueOf(contactID));

                    if (contactThumb != null) {

                        final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

                        final int width = contactThumb.getWidth();
                        final int height = contactThumb.getHeight();
                        final int ratio = width / height;

                        final Bitmap resized = ThumbnailUtils.extractThumbnail(contactThumb, (THUMBNAIL_SIZE * ratio),
                                THUMBNAIL_SIZE);

                        Drawable icon = new BitmapDrawable(getActivity().getResources(), resized);

                        alert.setIcon(icon);

                        alert.setTitle("Contact details");

                        final TextView homeTV = new TextView(getActivity());

                        homeTV.setText(contactName + " : " + contactID);
                        homeTV.setTextSize(12);

                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
                            homeTV.setTextColor(Color.WHITE);
                        }

                        homeTV.setPadding(30, 2, 20, 10);
                        homeTV.setMovementMethod(LinkMovementMethod.getInstance());

                        alert.setView(homeTV);
                        alert.show();

                    } else {
                        Toast.makeText(getActivity(), "Photo null", Toast.LENGTH_SHORT).show();
                    }
                }

            }

            break;
        }
    } else {
        // cancelled or error
    }
}

As tentativas de contactthumb ....

import java.io.InputStream;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.util.Log;

public class ContactThumb {

private static final String TAG = "THUMB";

public static String getDisplayName(final Context ctx, final Uri contactURI) {

    String cname = null;

    try {

        final String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
        final Cursor cursor = ctx.getContentResolver().query(contactURI, projection, null, null, null);

        if (cursor != null) {

            try {

                if (cursor.moveToFirst()) {
                    cname = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                }

            } finally {
                cursor.close();
            }

        }

    } catch (final Exception e) {
        e.printStackTrace();
    }

    return cname;
}

public static Bitmap loadContactPhoto(final Context ctx, final long contactId) {

    final Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);

    final InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(), contactUri);

    if (input != null) {
        Log.i(TAG, "loadContactPhoto: input");

        return BitmapFactory.decodeStream(input);

    } else {

        byte[] photoBytes = null;

        Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);

        final Cursor c = ctx.getContentResolver().query(photoUri,
                new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO }, null, null, null);

        try {

            if (c.moveToFirst()) {
                photoBytes = c.getBlob(0);
            }

        } catch (final Exception e) {
            e.printStackTrace();

        } finally {
            c.close();
        }

        if (photoBytes != null) {

            Log.i(TAG, "loadContactPhoto: photoBytes");

            return BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);

        } else {

            Bitmap another = finalAttempt(ctx, contactId);

            if (another != null) {

                Log.i(TAG, "loadContactPhoto: another");

                return another;
            } else {

                Log.i(TAG, "loadContactPhoto: might be returning default");

                return getFacebookPhoto(ctx, getContactNumber(ctx, String.valueOf(contactId)));
            }
        }
    }
}

public static String getContactNumber(final Context ctx, final String contactID) {

    Cursor phones = null;

    try {

        phones = ctx.getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = " + contactID, null, null);

        String cnum = null;

        if (phones != null && phones.getCount() > 0) {

            while (phones.moveToNext()) {
                cnum = phones.getString(phones.getColumnIndex(Phone.NUMBER));

                if (cnum != null && !cnum.isEmpty() && !cnum.contains("@")) {

                    Log.i(TAG, "getContactNumbers: : cnum: " + cnum);

                    try {
                        phones.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return cnum;
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

public static Bitmap getFacebookPhoto(final Context ctx, String phoneNumber) {

    Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Uri photoUri = null;
    ContentResolver cr = ctx.getContentResolver();

    Cursor contact = cr.query(phoneUri, new String[] { ContactsContract.Contacts._ID }, null, null, null);

    if (contact.moveToFirst()) {
        long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);

    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    if (photoUri != null) {
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        }
    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), android.R.drawable.ic_menu_report_image);
    return defaultPhoto;
}

public static Bitmap finalAttempt(final Context ctx, final long contactId) {

    byte[] photoBytes = null;

    String[] projection = new String[] { ContactsContract.Contacts.PHOTO_ID, ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER, };

    ContentResolver cr = ctx.getContentResolver();

    final Uri contactUri = ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, contactId);

    Cursor cursor = cr.query(contactUri, projection, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

    if (cursor != null && cursor.moveToFirst()) {

        int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);

        Cursor c = cr.query(photoUri, new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO }, null, null, null);

        try {
            if (c.moveToFirst()) {
                photoBytes = c.getBlob(0);
            }

        } catch (Exception e) {

        } finally {
            cursor.close();
            c.close();
        }

        if (photoBytes != null) {
            return BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);
        }
    }

    return null;
}

}

Se algum dos métodos funcionar para você, vá votar a resposta que copiei e colei o código!

Verifique este link para o Os desenvolvedores do Android sugeriam maneira

Boa sorte

Parece que meu problema foi porque os contatos no meu dispositivo foram sincronizados no Facebook e, portanto, a foto não está disponível.

http://groups.google.com/group/android-developers/msg/be8d0cf3928e4b7f

A documentação do Android diz que devemos fazê -lo dessa maneira.

public Bitmap openPhoto(long contactId) {
        Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
        Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        Cursor cursor = getContentResolver().query(photoUri,
                new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
        if (cursor == null) {
            return null;
        }
        try {
            if (cursor.moveToFirst()) {
                byte[] data = cursor.getBlob(0);
                if (data != null) {
                    return BitmapFactory.decodeStream(new ByteArrayInputStream(data));
                }
            }
        } finally {
            cursor.close();
        }
        return null;

}

ContactId significa:

getString(c.getColumnIndex(ContactsContract.Contacts._ID))

fonte: https://developer.android.com/reference/android/provider/contactScontract.contacts.photo.html

Código tomado:desenvolvedor.android.com

public InputStream openPhoto(long contactId) {
     Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
     Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);
     Cursor cursor = getContentResolver().query(photoUri,
          new String[] {Contacts.Photo.PHOTO}, null, null, null);
     if (cursor == null) {
         return null;
     }
     try {
         if (cursor.moveToFirst()) {
             byte[] data = cursor.getBlob(0);
             if (data != null) {
                 return new ByteArrayInputStream(data);
             }
         }
     } finally {
         cursor.close();
     }
     return null;
 }

Depois de algumas pesquisas, encontrei a solução em: Exibindo o crachá de contato rápido

Meu código com algumas pequenas modificações, funciona bem para mim

    public Bitmap loadContactPhoto(String name) {
    String photoUri = null;     
    int thumbnailColumn;        
    ContentResolver cr = GlobalData.instance().getContext().getContentResolver();
    String[] projection = new String[] { ContactsContract.Contacts._ID ,ContactsContract.Contacts.PHOTO_ID,  ContactsContract.Contacts.PHOTO_URI, ContactsContract.Contacts.PHOTO_THUMBNAIL_URI};
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, ContactsContract.Contacts.DISPLAY_NAME + "='" + name + "'", null, null);
    if (cursor.moveToFirst()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
                thumbnailColumn =   cursor.getColumnIndex(Contacts.PHOTO_THUMBNAIL_URI);
            else
                thumbnailColumn = cursor.getColumnIndex(PhoneLookup._ID);

            photoUri = cursor.getString(thumbnailColumn);

            if(photoUri != null)
                return loadContactPhotoThumbnail(photoUri);
            else
                return null;    
    }
    return null;
}
private Bitmap loadContactPhotoThumbnail(String photoData) {
    AssetFileDescriptor afd = null;
    try {

        Uri thumbUri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            thumbUri = Uri.parse(photoData);
        } else {
            final Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_URI, photoData);
            thumbUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY);
        }
        afd = GlobalData.instance().getContext().getContentResolver().openAssetFileDescriptor(thumbUri, "r");
        FileDescriptor fileDescriptor = afd.getFileDescriptor();
        if (fileDescriptor != null)
            return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, null);
    } catch (FileNotFoundException e) {
    } finally {
        if (afd != null) {
            try {
                afd.close();
            } catch (IOException e) {
            }
        }
    }
    return null;
}

Verifique minha postagem:

https://stackoverflow.com/a/41445851/1733810

public  Bitmap retrieveContactPhoto(Context context, String number) {
        ContentResolver contentResolver = context.getContentResolver();
        String contactId = null;
        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID};

        Cursor cursor =
                contentResolver.query(
                        uri,
                        projection,
                        null,
                        null,
                        null);

        if (cursor != null) {
            while (cursor.moveToNext()) {
                contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
            }
            cursor.close();
        }

        Bitmap photo = BitmapFactory.decodeResource(context.getResources(),
                R.mipmap.popup);

        try {

            Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(contactId));
            Uri displayPhotoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);

                AssetFileDescriptor fd =
                        getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r");
                InputStream inputStream=fd.createInputStream();


            if (inputStream != null) {
                photo = BitmapFactory.decodeStream(inputStream);
            }

            assert inputStream != null;
            inputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return photo;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top