我正在开发像按钮一样的facebook来集成我的应用程序。这是从developers.facebook.com复制的HTML代码
<html>
<body>
<div id="fb-root"></div>
<script>
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id))
return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=my_app_id";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<fb:like data-href="http://www.facebook.com/facintegra" data-send="true" data-width="450" data-show-faces="false" data-font="tahoma"/>
</body>
我的android活动代码
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.loadUrl("file:///android_asset/FacebookLikeView.html");
m_cObjFacebook = new Facebook("Your_id");
authorizefacebook();
}
private void authorizefacebook(){
m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() {
@Override
public void onComplete(Bundle values) {
m_cAccessToken = values.getString(Facebook.TOKEN);
}
@Override
public void onFacebookError(FacebookError error) {
System.out.println(error.toString());
}
@Override
public void onError(DialogError e) {
System.out.println(e.toString());
}
@Override
public void onCancel() {
System.out.println("Cancel");
}
});
}
}
当应用程序启动时,它会检查我是否登录到了facebook。如果没有,它会显示Facebook登录屏幕登录,然后登录成功后,它会进入我的Facebook页面,而不是我的Android应用程序页面。
如果它发现我已登录,则它会显示如下屏幕。
请在我出错的地方帮助我
我的应用的第一个屏幕
点击确定按钮
后的屏幕
点击我的网页视图中的“赞”按钮时,会重定向到链接facebook.com/connect/connect_to_external_page_reload.html。请帮帮我,我该怎么办?
由于
答案 0 :(得分:6)
我的猜测是你加载fb js sdk的webview没有cookie,所以用户没有经过身份验证。
您如何验证用户身份?它是否使用SSO(即,是否安装了fb应用程序?)如果是这种情况,则浏览器(webview)不知道用户已通过身份验证,当您单击它时,它只是尝试重定向您进行身份验证。
阅读新官方博文:Bringing Like to Mobile。
嗯,这看起来就像我猜测的那样。您看到它显示“注册以查看...”,这意味着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
中的一个参数是你没有的signedRequest
,但值得一试。
当设备上存在facebook应用程序(katana)时,使用它完成身份验证,这意味着默认浏览器上的cookie不会被创建,因此当您使用like按钮打开webview时,js sdk不会知道你已经登录了,你可以把它想象成在firefox上登录facebook,然后在chrome上打开一个facebook,看看你还没有登录。
当未安装fb应用程序时,sdk使用带有webview的对话框对用户进行身份验证,该对话框创建了js sdk稍后可以使用的cookie,这就是为什么它在这种情况下“按预期”工作。
我在第一次编辑时提供的解决方法尝试在初始化时将身份验证数据传递给sdk。
正如我写的那样,我不确定它是否会起作用,也许你也需要传递一个已签名的请求,但是因为你没有它你需要创建它,如果你想尝试那样做与此处描述的完全相反:Singed Request,然后将其与访问令牌和过期参数一起传递给FB.init
。
您拥有的另一个选择是始终使用对话框进行身份验证,因此请阅读:How to disable Facebook single sign on for android - Facebook-android-sdk 我建议不要使用这种方法,因为它会导致糟糕的用户体验,毕竟在移动设备上输入电子邮件和密码并不是一件有趣的事情。
答案 1 :(得分:1)
我尝试了第一个选项,但我只能在我的Android应用程序中看到空白的webview