从Android FB SDK发布消息到Facebook墙上始终出错

21
我在使用从 http://github.com/facebook/facebook-android-sdk 下载的 Android FB SDK 时遇到了问题。尝试发布内容到墙上,但总是出现错误(权限已设置,并且已登录到 FB)。
以下是我的 onClick 函数代码片段,我对他们的示例代码进行了一些小修改:
Bundle params = new Bundle();

params.putString("message", "Test");
params.putString("name", "American Virgin");
params.putString("link", "http://bit.ly/12345");
params.putString("description", "A Freshman College Girl on a scholarship from an ...");
params.putString("picture", "http://xxx/MOV1026.jpg");

mAsyncRunner.request("me/feed", params, "POST", new TestRequestListener());

我从 DDMS 得到以下错误:

    09-16 18:55:28.372: WARN/Bundle(14392): Key picture expected byte[] but value was a java.lang.String.  The default value <null> was returned.
09-16 18:55:28.414: WARN/Bundle(14392): Attempt to cast generated internal exception:
09-16 18:55:28.414: WARN/Bundle(14392): java.lang.ClassCastException: java.lang.String
09-16 18:55:28.414: WARN/Bundle(14392):     at android.os.Bundle.getByteArray(Bundle.java:1220)
09-16 18:55:28.414: WARN/Bundle(14392):     at com.facebook.android.Util.openUrl(Util.java:153)
09-16 18:55:28.414: WARN/Bundle(14392):     at com.facebook.android.Facebook.request(Facebook.java:295)
09-16 18:55:28.414: WARN/Bundle(14392):     at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:209)
09-16 18:55:28.422: WARN/Bundle(14392): Key message expected byte[] but value was a java.lang.String.  The default value <null> was returned.
09-16 18:55:28.432: WARN/Bundle(14392): Attempt to cast generated internal exception:
09-16 18:55:28.432: WARN/Bundle(14392): java.lang.ClassCastException: java.lang.String
09-16 18:55:28.432: WARN/Bundle(14392):     at android.os.Bundle.getByteArray(Bundle.java:1220)
09-16 18:55:28.432: WARN/Bundle(14392):     at com.facebook.android.Util.openUrl(Util.java:153)
09-16 18:55:28.432: WARN/Bundle(14392):     at com.facebook.android.Facebook.request(Facebook.java:295)
09-16 18:55:28.432: WARN/Bundle(14392):     at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:209)
09-16 18:55:28.452: WARN/Bundle(14392): Key format expected byte[] but value was a java.lang.String.  The default value <null> was returned.
09-16 18:55:28.472: WARN/Bundle(14392): Attempt to cast generated internal exception:
09-16 18:55:28.472: WARN/Bundle(14392): java.lang.ClassCastException: java.lang.String
09-16 18:55:28.472: WARN/Bundle(14392):     at android.os.Bundle.getByteArray(Bundle.java:1220)
09-16 18:55:28.472: WARN/Bundle(14392):     at com.facebook.android.Util.openUrl(Util.java:153)
09-16 18:55:28.472: WARN/Bundle(14392):     at com.facebook.android.Facebook.request(Facebook.java:295)
09-16 18:55:28.472: WARN/Bundle(14392):     at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:209)
3个回答

46

解决方法是:

if (parameters.get(key) instanceof byte[]) {

而不是

if (parameters.getByteArray(key) != null) {

在 Util.java 的第 63 行。

而且

if (params.get(key) instanceof byte[]) {
代替
if (params.getByteArray(key) != null) {

在Util.java的第155行。

由于某些奇怪的原因,在三星Nexus S(也许其他设备也是如此),它返回一个字符串,而不是一个字节数组。


添加相同的问题,这些更改修复了它。 - Vivi
谢谢...当我对SDK进行了这些更改时,我只发布了URL和文本,现在已经正确了。 - rahul
非常感谢,我已经为此苦苦挣扎了半个小时,当我发现这篇文章时,我正要深入源代码。奇怪的行为... - Andras Balázs Lajtha
一年过去了,这仍然是个问题?真是醉了! - Erik B
一年半时间。运行完美。 - Fenix Voltres

10

这真的很奇怪...我有一个应用程序使用相同的语法,但它运行得非常好。我刚刚检查了FB SDK的源代码,似乎它已经改变了很多...我在SDK的src中找到了这个

    for (String key : params.keySet()) {
        if (params.getByteArray(key) != null) {
                dataparams.putByteArray(key, params.getByteArray(key));
        }
    }

那么,您尝试这样做:

Bundle params = new Bundle();

params.putByteArray("message", "Test".getBytes());
params.putByteArray("name", "American Virgin".getBytes());
params.putByteArray("link", "http://bit.ly/12345".getBytes());
params.putByteArray("description", "A Freshman College Girl on a scholarship from an ...".getBytes());
params.putByteArray("picture", "http://xxx/MOV1026.jpg".getBytes());

mAsyncRunner.request("me/feed", params, "POST", new TestRequestListener());

嗨,克里斯蒂安,谢谢你的回答。实际上,这段代码确实有效,但在我的fb墙上出现需要很长时间,但警告消息仍然存在。你是对的,问题出在了强制转换操作上。如果我放'POST',那么参数必须是字节数组而不是字符串。尝试使用字节数组,但错误仍然出现,因为另一个参数(图形路径、令牌键仍然是字符串)。 - Lorensius W. L. T
你好,Christian。我正在使用这段代码,但是我无法在Facebook上发布图片... 我得到的响应是{ "data": [] }。 - hharry_tech

0

我认为错误信息非常清楚... "Key picture expected byte[] but value was a java.lang.String."

在您的Bundle params中,键"picture"的值应该是一个字节数组,而不是一个字符串。

编辑:没有看到Cristian的答案。我很确定你应该传递实际的图像数据,而不是文件名的字节。但我可能错了。

另一个编辑:是的,所以如果我可以的话,我会给自己的答案投反对票,但似乎我甚至没有正确地阅读问题。这个错误不仅发生在图片上,所以我不知道出了什么问题...


好的,没问题,看起来问题出在SDK上。我会尝试手动编辑它。谢谢你的回答,benvd... - Lorensius W. L. T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接