我的猜测是,您加载 fb js sdk 的 webview 没有 cookie,因此用户未经过身份验证。
您如何验证用户身份?是否使用 SSO(即安装了 fb 应用程序?)如果是这种情况,则浏览器(webview)不知道用户已通过身份验证,当您单击它时,它只是尝试重定向您进行身份验证。
阅读新的官方博客文章:为移动设备带来点赞 https://developers.facebook.com/blog/post/2012/06/20/bringing-like-to-mobile/.
Edit
嗯,这看起来和我猜的一模一样。您会看到它显示“Sign up to see...”,这意味着 js sdk 无法识别用户已登录并经过身份验证。
我能想到的你有两个选择:
1.正如我所写,使用新的Like
行动并创建您自己的“喜欢按钮”。
2. 通话时FB.init
通过authResponse
参数与您从 android 获得的参数类似:
Java部分
m_cObjFacebook = new Facebook("Your_id");
m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() {
@Override
public void onComplete(Bundle values) {
String response = m_cObjFacebook.request("me");
JSONObject json = Util.parseJson(response);
showWebView(json.getString("id"));
}
....
});
private void showWebView(String userid) {
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
StringBuilder url = new StringBuilder("file:///android_asset/FacebookLikeView.html?");
url.append("token=").append(cObjFacebook.getAccessToken());
url.append("&expires=").append(cObjFacebook.getAccessExpires());
url.append("&user=").append(userid);
mWebView.loadUrl(url.toString());
}
Html/Javascript 部分:
<script type="text/javascript">
window.fbAsyncInit = function() {
var data = {},
query = window.location.search.substring(1);
query = query.split("&");
for (var i = 0; i < query.length; i++) {
var pair = query[i].split("=");
data[pair[0]] = pair[1];
}
FB.init({
appId: "YOUR_APP_ID",
xfbml: true,
authResponse: data
});
};
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
</script>
<div class="fb-like" data-href="http://www.facebook.com/FacIntegra" data-send="false" data-width="450" data-show-faces="false" data-font="tahoma"></div>
我不是 100% 确定这个技巧会起作用,因为其中的参数之一authResponse
is the signedRequest
你没有,但值得一试。
2nd Edit
当设备上存在 facebook 应用程序 (katana) 时,将使用它完成身份验证,这意味着默认浏览器上的 cookie 不会创建,因此当您使用 Like 按钮打开 Web 视图时,js sdk 不会意识到您正在使用登录,你可以想象成在firefox上登录facebook,然后在chrome上打开facebook,发现自己没有登录。
当 fb 应用程序未安装时,sdk 使用带有 webview 的对话框对用户进行身份验证,这会创建 js sdk 稍后可以使用的 cookie,这就是它在这种情况下“按预期”工作的原因。
我在第一次编辑中为您提供的解决方法尝试在初始化时将身份验证数据传递给 SDK。
正如我当时所写的,我不确定它会起作用,也许你还需要向它传递一个签名的请求,但由于你没有它,你需要创建它,如果你想尝试这样做与此处描述的完全相反:辛吉德请求 http://developers.facebook.com/docs/authentication/signed_request/,然后将其传递给FB.init
以及访问令牌和过期参数。
您的另一个选择是始终使用对话框进行身份验证,请阅读以下内容:如何禁用 Android 的 Facebook 单点登录 - Facebook-android-sdk https://stackoverflow.com/questions/4521013/how-to-disable-facebook-single-sign-on-for-android-facebook-android-sdk.
我建议不要使用这种方法,因为它会导致糟糕的用户体验,毕竟在移动设备上输入电子邮件和密码并不是一件有趣的事情。