Facebook像buttonredirect到Android的Facebook网站

我正在开发Facebook像button来整合我的应用程序。这里是从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"); } }); } } 

当应用程序启动它检查我是否login到Facebook或不。 如果没有,它会显示Facebooklogin屏幕login,然后login成功后,它会进入我的Facebook页面,而不是我的Android应用程序页面。

如果它发现我login,那么它会给出如下屏幕。

请帮我,我哪里错了

我的应用程序的第一屏

我的第一个屏幕

单击确定button后的屏幕

第二个屏幕

当点击我的web视图中的像button时,其redirect到链接facebook.com/connect/connect_to_external_page_reload.html。 请帮我,我该怎么办?

谢谢

Solutions Collecting From Web of "Facebook像buttonredirect到Android的Facebook网站"

我的猜测是,加载fb js sdk的webview没有cookie,所以用户没有被authentication。

你如何authentication用户? 它是使用SSO(即是否安装了fb应用程序?)如果是这样的话,那么浏览器(webview)不知道用户通过身份validation,当你点击它,它只是试图redirect你的身份validation。

阅读新的官方博客文章: 带来移动 。


编辑

那么,这看起来完全是我猜的。 您会看到它显示“注册以查看…”,这意味着js sdk无法识别用户已login并进行身份validation。

你有两个可以想到的select:
1.当我写的使用新的Like行动,并创build自己的“喜欢的button”。
2.当调用FB.init通过你从android获得的authResponse参数时,会看起来像这样:

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)时,使用它进行身份validation,这意味着默认浏览器上的cookie不会被创build,所以当您使用类似button打开webview时,js sdk并不知道您是login后,你可以把它想象成在Firefox上loginFacebook,然后在Chrome上打开一个Facebook,看看你没有login。

当没有安装fb应用程序时,sdk使用带有webview的对话框对用户进行身份validation,从而创build可供js sdk稍后使用的cookie,这就是为什么在这种情况下“按预期”工作。

我在第一次编辑中给你的解决方法是在初始化时将validation数据传递给sdk。
正如我写的那样,我不确定它会工作,也许你也需要通过一个签名的请求,但是因为你没有它,你需要创build它,如果你想尝试只是做与此处所描述的完全相反: Singed Request ,然后将其传递给FB.init以及访问令牌和过期参数。

你有另一个选项是始终使用对话框进行身份validation,为此阅读: 如何禁用Facebook的单点loginAndroid – Facebook的android的sdk 。
我build议不要使用这种方法,因为这会导致糟糕的用户体验,毕竟在移动设备上input电子邮件和密码并不是一件有趣的事情。

我试过第一个选项,但我可以看到只有空白的webview没有其他在我的android应用程序