15

我已经设置了简单的 facebook 登录。对于 Android 2.3.6,一切正常,用户得到提示登录对话框,输入数据和应用程序继续。我以为是安卓版本的问题,但结果是当手机上安装了facebook应用程序时登录不起作用!

对此进行了测试: Galaxy Ace 2.3.6 HTC Desire 4.1.2 Galaxy Note 4.1.2 Android 模拟器 4.1.2

甚至 facebook 示例都无法正常工作!

每次应用程序执行时 -else { Log.d("SESSION NOT OPENED", "SESSION NOT OPENED"); }

似乎会话没有打开,但这是为什么呢?遵循本指南 - https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

代码:

Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(final Session session, SessionState state, Exception exception) {

            if (session.isOpened()) {

                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            Log.d("Access_token", session.getAccessToken());
                        }
                    }
                });
            } else {
                Log.d("SESSION NOT OPENED", "SESSION NOT OPENED");
            }
        }
    });
4

7 回答 7

14

我正在为那些正在使用的人写这个答案Facebook SDK 4.X

您可以通过以下两种方式之一打开 facebook 的登录门户:

  1. 如果您有一个 android 设备,Android 1.9.X并且Facebook App安装在Native Login此处称为 Method 的设备中,则无需使用 facebookWebView

  2. 如果您还没有安装Facebook App在您的 Android 设备中,那么它很好用WebView

所以为此 Facebook 提供 3Constants

  1. NATIVE_ONLY(仅当您想在 Facebook 应用程序中打开时使用)
  2. WEB_ONLY(仅在您想打开时WebView使用)
  3. NATIVE_WITH_FALLBACKwebView(如果未安装应用程序,推荐 Facebook 检测和打开)

查看以下链接了解详情 https://developers.facebook.com/docs/reference/android/current/class/LoginButton/ https://developers.facebook.com/docs/facebook-login/android/v2.2#troubleshooting

     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_ONLY);
     LoginButton.setLoginBehavior(LoginBehavior.WEB_ONLY);
于 2015-08-18T08:12:43.680 回答
7

查看第 4 步的底部:https ://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

如果您没有正确输入您的应用程序密钥哈希,则通过 WebView 弹出窗口(如果未安装应用程序)登录 Facebook 仍然有效,但通过本机 Facebook 应用程序登录将无法正常工作。

您应该在 LogCat 中看到此异常:

com.facebook.http.protocol.ApiException: remote_app_id does not match stored id

Facebook SDK 会打印它的异常,所以如果有其他问题,无论如何都要检查那里。

于 2013-07-25T15:27:32.753 回答
6

使用此功能为您获取哈希键(调试和发布 apk)并将其放入您的应用程序 developer.facebook.com/apps

private void calculateHashKey(String yourPackageName) {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                yourPackageName,
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

这对我有很大帮助..希望这对你也有帮助..

于 2014-04-29T10:45:57.007 回答
2

如果我有活动的 facebook 会话(来自 facebook 应用程序),看起来我无法获取数据。

所以在我打开会话之前,我要求强制登录,即使用户已经从 facebook 应用程序打开了 facebook 会话。

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

所以现在一切正常,但用户必须手动输入数据。这并不理想,但它有效。

在打开 facebook 应用程序的情况下,即使是 facebook 样本也不适合我。

如果有人有更好的解决方案,请随时提出建议。

于 2013-07-25T15:06:27.810 回答
1

如果未正确生成哈希键,那么您可能会遇到以下问题

显示本机登录对话框,但在接受权限弹出窗口后,log cat 中没有任何反应

但是,如果设备上的本机应用程序被禁用,登录和共享将正常工作(在这种情况下,登录对话框会在 Web 视图中打开,并且不需要正确的哈希键)

我遇到了同样的问题,并通过使用此代码获取哈希键解决了这个问题。哈希键与使用 openSSl 和 keytool 生成的不同

在 Facebook 应用程序中更新此哈希键后一切正常

//================================== To Get Facebook Hash key Programmatically =========================//
    PackageInfo info;

     try {
            info = activity.getPackageManager().getPackageInfo("com.checkmyplanner", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                //String something = new String(Base64.encodeBytes(md.digest()));
                Log.e("hash key", something);
            }
        } catch (NameNotFoundException e1) {
            Log.e("name not found", e1.toString());
        } catch (NoSuchAlgorithmException e) {
            Log.e("no such an algorithm", e.toString());
        } catch (Exception e) {
            Log.e("exception", e.toString());
        }

只需更改您的软件包名称并获取正确的哈希键

于 2014-04-11T11:48:17.953 回答
1

Facebook 的 Android 登录快速入门底部有一个重要步骤。

对于 Android 11 及更高版本,应用程序需要queries为其想了解的每个应用程序提供一个条目。没有这个,应用程序将不会知道 Facebook 已安装,并且将始终打开自定义 Chrome 选项卡。

com.facebook.katana在您的AndroidManifest.xml查询中添加一个条目。

<queries>
  <package android:name="com.facebook.katana" />
</queries> 

作为参考,我使用的是 FB SDK 5.6

于 2021-08-26T03:22:15.847 回答
-1

在此处输入图像描述

禁用沙盒模式...这将允许您的应用在所有设备上运行。试试这个解决方案

于 2013-07-25T11:36:54.520 回答