我使用Facebook Android SDK。
目标
在Facebook已登录的用户的新闻动态中创建包含Android设备上的照片(其SD卡)和一些评论的多个帖子。最终结果应该与直接在Facebook上添加照片/视频功能时相同。最终效果应该像这样:
期望的Facebook结果
问题
我无法做到。
我查看了Stack Overflow上众多类似的帖子,但到目前为止还没有答案。
我迄今尝试实现的内容
方法一:SD卡照片上传至Facebook相册
如何操作
从我的移动设备(其SD卡)上传图片到为我的应用程序创建的相册中。在构造params对象时,我使用“picture”键并将图片的字节作为其值。在Facebook(或AsyncFacebookRunner)对象的“request(...)”调用中使用“me/photos”。
问题
并非所有上传的图像都会显示在我的墙上。而是会显示类似于“xxx相册中添加了x张照片”的信息。
以下是代码片段(针对一张图片):
Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
asyncRunner.request("me/photos", params, "POST", new PostPhotoRequestListener(), null);
Facebook的结果
方法2:将互联网照片添加到Facebook新闻动态
如何实现
在我的墙上发布帖子时,显示存储在互联网上的图片。在这种情况下,在构建params对象时,我使用link
键并将其值设置为图片的URL。在 request(...)
调用中使用me/feed
。
问题所在
这会产生一些奇怪的输出,但这不是我想要的。
代码��如下(针对一张图片)
Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putString("link", "http://i1114.photobucket.com/albums/k538/tom_rada/bota2.jpg");
asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);
Facebook 结果
方法三:结合方法一和二的方式
如何实现
我尝试使用picture
关键字,并将照片字节设置为其值(与方法1相同),然后以me/feed
请求的方式进行调用(与方法2相同)。
问题
消息的生成与我的预期一致,但未包括任何照片。
以下是代码片段(用于一个图片)
Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);
Facebook结果
那么,有什么想法可以帮我实现目标吗?
编辑 - 发现解决方法
似乎唯一在用户的墙上创建包含照片的新帖子的方法是将照片和相关评论添加到用户的墙照片相册中。
如何 - 代码片段
注意:应该使用异步调用替换 facebook.request
调用,以便操作不会阻塞 UI 线程!!!
String wallAlbumID = null;
String response = facebook.request("me/albums");
JSONObject json = Util.parseJson(response);
JSONArray albums = json.getJSONArray("data");
for (int i =0; i < albums.length(); i++) {
JSONObject album = albums.getJSONObject(i);
if (album.getString("type").equalsIgnoreCase("wall")) {
wallAlbumID = album.getString("id");
Log.d("JSON", wallAlbumID);
break;
}
}
...然后
if (wallAlbumID != null) {
Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putByteArray("source", bytes);
asyncRunner.request(wallAlbumID+"/photos", params, "POST", new PostPhotoRequestListener(), null);
}