Android - 获取联系人的Facebook图片

时间:2014-01-02 13:36:30

标签: java android facebook android-contacts

Android平台非常有趣,特别是在解决问题时。事实上,在互联网上可能有关于Android开发的所有知识。

好吧,我已经找了大约一个星期,但没有找到任何与工作有关的东西。让我们深入研究它。

我们正在构建一个Android应用程序,它需要对设备上的现有联系人进行读/写访问。使用这种方法阅读联系人的设置照片变得非常容易:

// Returns a stream reading a contact thumbnail
public InputStream getContactThumbnail(int id) {
    // Stream reading contact image
    InputStream stream = ContactsContract.Contacts.openContactPhotoInputStream(
        context.getContentResolver(), 
        ContentUris.withAppendedId(
            ContactsContract.Contacts.CONTENT_URI, id
        )
    );

    // If image is null, try to read Facebook image
    if (stream == null) {
        stream = new ByteArrayInputStream(getFacebookPhoto(id));
    }

    return stream;
}

现在,前一个方法接收一个id作为参数,并返回一个Stream,可以读取联系人的缩略图。 需要成为一个流,因为手机就像一个Web服务器并且有多个线程在运行。如果在相同的短时间内多次请求缩略图,则肯定会抛出 OutOfMemoryException

我需要正确实现 getFacebookPhoto(int)方法,以便它返回读取联系人的Facebook个人资料图片的任何流,该联系人的联系人与其各自的Facebook个人资料相关联。我已经尝试过多次失败了。

假设#1

如果联系人与Facebook个人资料相关联,则必须将Facebook ID保存在某处。如果可以访问此信息,则可以使用图表轻松获取Facebook个人资料图片。问题是需要互联网连接。

假设#2

Facebook缩略图保存在SD卡的某个位置。也许在Contact和那些可以通过SQLite请求找到的文件之间有一个链接?

假设#3

叹息,我看起来很绝望。好的,如果我理解正确,电话联系人和Facebook联系人在数据库中不是一回事。如果您从以下URI查询所有联系人: * ContactsContract.Contacts.CONTENT_URI * 您只能获得您创建的联系人以及Facebook链接的任何内容。有没有办法找到所有链接的联系人并获取他们各自的照片?

结论

是的,那就是。总结一下,我需要阅读所有联系人信息。对于每个联系人,我必须找到它的照片。如果用户尚未将图片设置为链接到Facebook个人资料的联系人,则必须阅读其链接的个人资料图片。

到目前为止,StackOverflow社区已经提供了很大帮助,并且无数次地挽救了我的生命和工作。有可能,我在其他应用程序中看到过它。

感谢您花费您的时间,真的很感激。

修改

我们不要放弃!我会尽快开始 100pts赏金

3 个答案:

答案 0 :(得分:3)

你的假设在某种程度上是正确的。在联系人申请中,这些事情按照以下方式处理 -

  1. 设备的联系人&其Facebook帐户由联系人的_ID& Facebook的id,这是一对一的映射。所以从这个映射首先你必须找到Facebook ID 保持联系的人。但是在哪个表格中存储了此信息&无论你是否将这张桌子放在你的桌子上,URL完全取决于供应商。{/ p>

  2. 从Facebook ID我们可以从Facebook的服务器或Media DB获取相应的个人资料图片,如果它也被缓存在中。

  3. 但并非所有OEM都支持此功能。并且实施因OEM而异,因为Google不对其执行任何通用标准实施。 因此,无法保证单个实施将适用于来自不同OEM的所有设备。

答案 1 :(得分:0)

你应该真的去使用Facebook开发者网站上的Graph Explorer,它将帮助你弄清楚你需要做些什么才能获得某些东西。为了获得一个人的图片,你只需要做一个简单的GET HTTPRequest,图形路径为/ ID?fields = picture(其中ID是联系人的facebook id),它将返回一个包含JSON对象的JSON对象该人的个人资料图片的链接。从那里你可以很简单地获得图像。

你也可以通过向/我/朋友发送GET请求来获取图片信息的所有人的朋友吗?fields = picture。看起来你试图避免网络连接,但如果Android联系人没有存储facebook id,那么你将不得不自己得到id,我害怕。

希望有所帮助。

答案 2 :(得分:-1)

为什么不使用FQL,对于Android你可以使用 -

String query = "SELECT uid, name, pic, pic_small, pic_big FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())";

Bundle params = new Bundle();
params.putString("method", "fql.query");
params.putString("query", query);
mAsyncFacebookRunner.request(null, params, new CustomRequestListener());

其中CustomRequestListener()在Facebook Android SDK中扩展RequestListener。