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赏金。
答案 0 :(得分:3)
你的假设在某种程度上是正确的。在联系人申请中,这些事情按照以下方式处理 -
设备的联系人&其Facebook帐户由联系人的_ID
& Facebook的id
,这是一对一的映射。所以从这个映射首先你必须找到Facebook ID
保持联系的人。但是在哪个表格中存储了此信息&无论你是否将这张桌子放在你的桌子上,URL
完全取决于供应商。{/ p>
从Facebook ID我们可以从Facebook的服务器或Media DB获取相应的个人资料图片,如果它也被缓存在中。
但并非所有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。