10

我正在开发类似 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>

我的安卓活动代码

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。请帮帮我我该怎么办?

谢谢

4

2 回答 2

6

我的猜测是,您加载 fb js sdk 的 web 视图没有 cookie,因此用户未通过身份验证。

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

阅读新的官方博客文章:为移动带来点赞


编辑

嗯,这看起来和我猜的一模一样。您会看到它说“注册以查看...”,这意味着 js sdk 无法识别用户已登录并经过身份验证。

您有两个我能想到的选择:
1. 正如我所写,使用新Like操作并创建您自己的“点赞按钮”。
2.使用你从 androidFB.init获得的参数调用传递参数时,将如下所示: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% 确定这个技巧会奏效,因为其中一个参数authResponsesignedRequest你没有的,但值得一试。


第二次编辑

当设备上存在 facebook 应用程序(katana)时,使用它完成身份验证,这意味着不会创建默认浏览器上的 cookie,因此当您使用类似按钮打开 web 视图时,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
我建议不要使用这种方法,因为它会导致糟糕的用户体验,毕竟在移动设备上输入电子邮件和密码并不是一件有趣的事情。

于 2012-06-26T13:45:33.373 回答
1

我尝试了第一个选项,但在我的 android 应用程序中只能看到空白的 webview

于 2012-10-11T06:42:52.707 回答