获取与facebook同步的Android的联系人照片

我试图在我的应用程序中显示联系人图片,但我得到的只是手动添加,而不是与Facebook同步的那些的图片。 如何解决这个问题? 这里是我的代码如下:

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(PhotoId)); InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); return BitmapFactory.decodeStream(input); 

Solutions Collecting From Web of "获取与facebook同步的Android的联系人照片"

它不适用于仅从FB同步的联系人。 您需要使用FBgraphicsAPI并从那里获取照片; 而你需要知道联系人的facebook名称。

  Bitmap contactPhoto = getImageBitmap("http://graph.facebook.com/mathiaslin/picture?type=square"); final private static Bitmap getImageBitmap(String url) { Bitmap bm = null; try { URLConnection conn = new URL(url).openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { Log.e(TAG, "Error getting bitmap", e); } return bm; } 

我已经尝试了写在堆栈溢出时的每一个解决scheme,没有什么会通过正式的Facebook应用程序帐户同步适配器正确检索来自Facebook的照片。

要清楚的是,发布“认为”工作的解决scheme的人们可能使用的HTC感应电话附带由HTC编写的Facebook同步适配器,与官方的Facebook应用程序没有相同的安全要求。

这是一个安全的事情,其中​​一个方法设法访问facebook照片的字节,你将最终与一个SqliteException说所请求的内容是有限的。

与系统进程相同的代码运行将拉好照片。 这是不可能的。

您提供的代码只能访问默认的照片。 此外,您应该将联系人ID附加到该URI,而不是照片ID(假设您正在使用数据表中的照片ID)。

如果有多张照片,您可能需要尝试从数据表中直接访问它们。 你将需要parsing一个数据库光标,并手动将原始字节数据转换为位图,如下所示:

 String[] projection = {ContactsContract.CommonDataKinds.Photo.PHOTO}; Uri uri = Uri. ContactsContract.Data.CONTENT_URI; String where = ContactsContract.Data.MIMETYPE + "=" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + " AND " + ContactsContract.Data.CONTACT_ID + " = " + mContactId; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); if(cursor!=null&&cursor.moveToFirst()){ do{ byte[] photoData = photoCursor.getBlob(0); Bitmap photo = BitmapFactory.decodeByteArray(photoData, 0, photoData.length, null); //Do whatever with your photo here... }while(cursor.moveToNext()); } 

您需要mContactId与您想要照片的联系人相对应。

如果你想限制只有Facebook的照片,你需要使用ContactsContract.Data.RAW_CONTACT_ID而不是,你应该从RawContacts表使用您的联系人ID和一个基于Facebook帐户的filter(假设你知道你是什么帐户正在寻找……可能因同步供应商实施而异…)

我得到了所有的联系人的图片,甚至一些从facebook与这个代码同步:

  * @param context * The context used to retrieve the image. * @return The image of the user that is saved in the address book or null if * the user does not exists or has no image. */ public Bitmap getContactPhoto(Context context) { ContentResolver contentResolver = context.getContentResolver(); Uri photoUri = getCurrentUri(contentResolver); if (photoUri != null) { InputStream input = ContactsContract.Contacts.openContactPhotoInputStream( contentResolver, photoUri); if (input != null) { return BitmapFactory.decodeStream(input); } } else { Log.d(getClass().getSimpleName(), "No photo Uri"); } return null; } private Uri getCurrentUri(ContentResolver contentResolver) { Cursor contact = contentResolver.query(lookUpUri, new String[] { ContactsContract.Contacts._ID }, null, null, null); if (contact.moveToFirst()) { long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID)); return ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId); } return null; } 

也许再看一遍创build你的photoId的代码。 不要在数据表中使用照片的ID来创buildUri。 我也尝试过,只有当我使用直接链接到合并用户的URI时,才能检索出适合我的照片。 然后,您将获得此人的默认图像,无论从何处同步。

标准的方式绝对没有办法做到这一点。 所以,我们必须使用SQL注入才能破解联系人数据库并获得Facebook头像。 以下代码在Android 2.2或更高版本上使用Motoblur的大多数Motorolas上都可以使用:

 public static Bitmap loadFacebookAvatar(Context context, long personId) { String[] rawProjection = {ContactsContract.RawContacts._ID}; String contactIdAssertion = ContactsContract.RawContacts.CONTACT_ID + " = " + personId; String rawWhere = new StringBuilder() .append(contactIdAssertion).append(") UNION ALL SELECT ") .append(ContactsContract.RawContacts._ID).append(" FROM view_raw_contacts WHERE (") .append(contactIdAssertion).toString(); Cursor query = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, rawProjection, rawWhere, null, null); if (query != null && query.moveToFirst()) { do { long id = query.getLong(query.getColumnIndex(ContactsContract.RawContacts._ID)); String[] projection = {ContactsContract.CommonDataKinds.Photo.PHOTO}; Uri uri = ContactsContract.Data.CONTENT_URI; String mimeTypeAssertion = ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; String photoAssertion = ContactsContract.CommonDataKinds.Photo.PHOTO + " IS NOT NULL"; String rawContactIdAssertion = ContactsContract.CommonDataKinds.Photo.RAW_CONTACT_ID + " = " + id; String where = new StringBuilder().append(mimeTypeAssertion).append(" AND ") .append(photoAssertion).append(" AND ").append(rawContactIdAssertion) .append(") UNION ALL SELECT ").append(ContactsContract.CommonDataKinds.Photo.PHOTO) .append(" FROM view_data WHERE (").append(photoAssertion).append(" AND ") .append(rawContactIdAssertion).toString(); Cursor photoQuery = context.getContentResolver().query(uri, projection, where, null, null); if (photoQuery != null && photoQuery.moveToFirst()) { do { byte[] photoData = photoQuery.getBlob(photoQuery.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO)); if (photoData != null) { return BitmapFactory.decodeByteArray(photoData, 0, photoData.length, null); } } while (photoQuery.moveToNext()); } } while (query.moveToNext()); } return null; } 

对于其他手机,您必须获取联系人数据库并对其进行分析,以确定如何应用SQL注入,这需要一个根深蒂固的手机。