Facebook Like按钮重定向到android中的facebook网站

Cha*_*har 10 android facebook facebook-like

我正在开发像按钮一样的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>
Run Code Online (Sandbox Code Playgroud)

我的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");
        }
    });
}
}
Run Code Online (Sandbox Code Playgroud)

应用程序启动时,它会检查我是否登录到facebook.如果没有,它会显示Facebook登录屏幕登录,然后登录成功后,它会进入我的Facebook页面,而不是我的Android应用程序页面.

如果它发现我已登录,则它会给出如下屏幕.

请帮我,我哪里出错了

我的应用的第一个屏幕

我的第一个屏幕

单击确定按钮后的屏幕

第二个屏幕

单击我的webview中的like按钮时,它会重定向到链接facebook.com/connect/connect_to_external_page_reload.html.请帮帮我,我该怎么办?

谢谢

Nit*_*mer 6

我的猜测是你加载fb js sdk的webview没有cookie,所以用户没有经过身份验证.

你是如何验证用户的?它是否使用SSO(即,是否安装了fb应用程序?)如果是这种情况,则浏览器(webview)不知道用户已通过身份验证,当您单击它时,它只是尝试重定向您进行身份验证.

阅读新的官方博客文章:带来喜欢移动.


编辑

嗯,这看起来就像我猜测的那样.您看到它显示"注册以查看...",这意味着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());
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我不是百分百肯定这个技巧会起作用,因为其中一个参数authResponsesignedRequest你没有的,但是值得一试.


第二次编辑

当设备上存在facebook应用程序(katana),然后使用它完成身份验证,这意味着默认浏览器上的cookie不会被创建,所以当你用类似按钮打开webview时,js sdk不知道你是登录后,您可以将其想象为在Firefox上登录facebook,然后在Chrome上打开Facebook并看到您没有登录.

当没有安装fb应用程序时,sdk使用带有webview的对话框对用户进行身份验证,该对话框创建了js sdk稍后可以使用的cookie,这就是为什么它在这种情况下"按预期"工作的原因.

我在第一次编辑时给你的解决方法尝试在初始化时将身份验证数据传递给sdk.
正如我写的那样,我不确定它是否会起作用,也许你还需要传递一个已签名的请求,但是因为你没有它你需要创建它,如果你想尝试那就做与此处描述的完全相反:Singed Request,然后将其传递给FB.init访问令牌和expire参数.

你有另一个选择是始终使用对话框进行身份验证,为此读取:如何禁用Facebook单点登录为Android - Facebook-android-sdk.
我建议不要使用该方法,因为它会导致糟糕的用户体验,因为在移动设备上输入电子邮件和密码并不是一件有趣的事情.