代码之家  ›  专栏  ›  技术社区  ›  Yash

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

  •  7
  • Yash  · 技术社区  · 15 年前

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

    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(PhotoId));
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri);
    return BitmapFactory.decodeStream(input);
    
    5 回复  |  直到 15 年前
        1
  •  4
  •   Mathias Conradt    15 年前

    它不适用于仅从FB同步的联系人。您需要使用fbgraph API并从那里获取照片;您需要知道联系人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;
    }
    
        2
  •  2
  •   Eric    15 年前

    在写这篇文章的时候,我已经尝试过每一个堆栈溢出的解决方案,没有任何东西可以通过官方的Facebook应用程序帐户同步适配器正确地检索来自Facebook的照片。

    需要说明的是,发布“认为”自己有效的解决方案的人可能使用的是HTC sense手机,该手机配备了HTC编写的Facebook同步适配器,与Facebook官方应用程序的安全要求不同。

    这是一个安全问题,其中一个方法试图访问facebook照片的字节,结果会出现SqliteException,说请求的内容是受限的。

    运行相同的代码作为一个系统进程将拉照片罚款。只是现在还不可能。

        3
  •  0
  •   Charles B    15 年前

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

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

    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与您想要照片的联系人对应。

        4
  •  0
  •   Janusz Daniel Rindt    15 年前

     * @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;
    }
    

        5
  •  0
  •   Cristian    15 年前

    绝对没有办法用标准的方式来做这件事。因此,我们必须使用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注入,这需要根电话。

    推荐文章