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

2024-06-26

我正在开发类似 facebook 的按钮来与我的应用程序集成。这是从开发人员.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 应用程序页面。

如果发现我已登录,则会显示如下屏幕。

请帮助我哪里出错了

我的应用程序的第一个屏幕

单击后的屏幕OK button

当单击我的网络视图中的“赞”按钮时,它会重定向到链接 facebook.com/connect/connect_to_external_page_reload.html。请帮帮我,我该怎么办?

Thanks


我的猜测是,您加载 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.
我建议不要使用这种方法,因为它会导致糟糕的用户体验,毕竟在移动设备上输入电子邮件和密码并不是一件有趣的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Facebook Like 按钮重定向到 Android 中的 Facebook 网站 的相关文章

随机推荐

  • Redis 与 SQL Server 性能对比

    应用程序性能是使用缓存而不是关系数据库的主要原因之一 因为它以键值对的形式将数据存储在内存中 所以我们可以将经常访问的不经常更改的数据存储在缓存中 从缓存中读取比从数据库中读取要快得多 Redis 是分布式缓存市场上最好的解决方案之一 我正
  • 如何在flutter中使用API​​调用嵌套的json数据?

    我的 JSON 看起来像这样 Info c type id 1 cleaning type A Cleaning c type id 2 cleaning type B Cleaning c type id 3 cleaning type
  • 如何融化数据框以获取范围内的所有日期?

    我有一个这样的数据集 import pandas as pd pd DataFrame col1 1 2 start date 1 3 2019 1 10 2019 end date 1 5 2019 1 12 2019 我想为开始日期和结
  • ASP.NET MVC 2 - 请求编码问题

    Hello 有一个控制器和一个通过 GET 接收一个参数的操作 大致如下 www site com controller action query Problem 示例 1 www site com controller action qu
  • C++ 中输出流的右对齐

    我正在使用 C 工作 我得到一个 10 位数字的字符串 字符数组 其中可能有也可能没有 3 个破折号 使其最多 13 个字符 是否有一种内置的流方式可以正确地证明它 我将如何打印到右对齐的流 是否有内置函数 方法可以执行此操作 或者我是否需
  • 关于相同的应用程序,但不同的应用程序商店有不同的二进制文件

    我有一个新的应用程序要在不久的将来推出 该应用程序将针对不同地区的应用程序商店提供不同的版本 包括 UI 语言和部分应用程序内容 我的问题是我是否可以创建不同的应用程序 不同的捆绑包 ID 和不同的应用程序的 iTunes 应用程序名称 但
  • 如何理解javascript React中的这段代码

    我在网上找到了这个函数在js中的实现 这个函数递归地过滤一个对象数组 每个对象可能有属性 children 它是对象数组 并且对象也可能有孩子等等 该函数工作正常 但我有点不明白 这是我的功能 getFilteredArray array
  • 如何在 NPM 中通过 package.json 使用 gitlab 存储库

    我正在开展一个内部项目 想在小组内分享一个工具 但如果我使用 npm 工具 它要么请求模块已在 npm 网站或公共 git 存储库上注册 我正在使用 gitlab 并且有一个私人令牌 git https gitlab ci token
  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • Postgres 9.3 JSON 输出多维对象

    鉴于此查询 SELECT id as id attributes gt gt name as file name status from workflow events where schema customer and type FILE
  • 如何更改 Android 模拟器中的屏幕方向?

    我们如何将模拟器屏幕方向更改为横向或纵向 Ctrl F12 is the keyboard shortcut
  • 带有单选框和复选框的 WinForms TreeView

    我有一个情况 我希望 TreeView 能够在多个根节点上显示单选按钮 并在其子节点上显示复选框 任何根节点下都只有一层子节点 无线电也应该表现得像一个组 即选择一个根并取消选择其他无线电 我一直试图用图像来伪造它 但它看起来不现实 我最初
  • 追踪 Haskell 中的错误

    我如何获得有关 Haskell 错误发生位置的更多信息 例如 昨天我正在开发一个 Haskell 程序 该程序解析输入文件 转换数据 然后打印出报告信息 有一次 我跑了 main 然后回来了 Prelude read parse error
  • 整数 numpy 数组乘以浮点数

    我有一个包含整数值的 numpy 数组 如果我将整个矩阵乘以一个浮点数 结果是一个浮点矩阵 但如果我通过 for 循环逐列相乘 它只给出整数部分 import numpy as np A np array 1 2 3 4 5 6 7 8 9
  • 在 Eclipse 中从 C++ 调用 Ada

    我正在尝试创建一个完全托管在 Eclipse 中 以 C 启动并调用 Ada 的程序 我已经加载了 GNATBench 并且可以毫无问题地运行 Ada 程序 我不能做的是让 C 项目调用 Ada 项目 经过一番搜寻 我找到并使用 make
  • JavaScript 预分配数组未捕获 RangeError:数组长度无效

    我有一个小循环的代码 它抛出 Uncaught RangeError Invalid Array Length 我能够在 Google Chrome 控制台中重现它 const COUNT 100 000 000 const xValues
  • 在 Pycharm 中使用 scikit-learn 未解析的属性引用“predict()”

    当使用 scikit learn 中的决策树分类器时 docs http scikit learn org stable modules tree html展示您将存储分类器的变量重新分配给其自身的输出 调用fit method clf t
  • scrapy中cookies的正确使用形式是什么

    我是个新手 我正在一个使用cookies的网络中使用scrapy 这对我来说是一个问题 因为我可以在没有cookies的网络上获取数据 但在有cookies的网络上获取数据对我来说很困难 我有这个代码结构 class mySpider Ba
  • 角度1.5.5材料设计给了我未知的提供者:$$HashMapProvider <- $$HashMap <- $$animateQueue <- $animate错误

    我正在尝试将角度材料 1 5 5 与角度 1 6 5 一起使用 我的代码如下所示 索引 html
  • Facebook Like 按钮重定向到 Android 中的 Facebook 网站

    我正在开发类似 facebook 的按钮来与我的应用程序集成 这是从开发人员 facebook com 复制的 html 代码 div div