安卓Facebook登录无法使用已安装的Facebook应用程序

15

我已经设置了简单的Facebook登录。对于Android 2.3.6,一切都像应该的那样工作——用户得到提示登录对话框,输入数据后应用程序继续运行。一开始我以为是Android版本的问题,但事实证明,当手机上安装有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");
            }
        }
    });

2
这样我就可以在onComplete方法中获取用户访问令牌,例如! - Karlis
你正在使用哪个版本的Facebook SDK? - Looking Forward
我正在使用facebook-sdk-3.0。 - Karlis
在将Facebook SDK作为库项目添加时,您是否已在属性中设置了目标? - Looking Forward
2
是的,我已经设置好了一切,在旧设备上可以运行,但在4.1版本上无法运行。我刚刚创建了一个干净的项目,并逐步按照Facebook入门教程进行操作,结果相同-对于2.3,我会得到登录弹出窗口,一切都正常工作,但对于4.1,我被问及是否允许访问某些内容,然后就是这样,我的数据没有显示! - Karlis
显示剩余6条评论
7个回答

14

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

你可以通过以下两种方式之一打开 Facebook 的登录页面:

  1. 如果您有安装了 Android 1.9.XFacebook App 的 Android 设备,则称为 本地登录 方法,您不需要使用 Facebook 的 WebView

  2. 如果您的 Android 设备没有安装 Facebook App,最好使用 WebView

因此,Facebook 提供了 3 个 Constants 来实现这一点:

  1. NATIVE_ONLY(仅在 Facebook App 中打开)
  2. WEB_ONLY(仅在 WebView 中打开)
  3. NATIVE_WITH_FALLBACK(推荐,Facebook 检测并在应用程序未安装时打开 webView

详细信息请查看以下链接 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);

7
请查看第4步的底部:https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/ 如果您没有正确输入应用程序密钥哈希值,则 Facebook Web 浏览器窗口弹出框(如果未安装应用程序)将仍然可以使用 Facebook 登录,但是通过原生 Facebook 应用程序的登录则无法实现。
您应该在 LogCat 中看到此异常:
com.facebook.http.protocol.ApiException: remote_app_id does not match stored id

如果存在其他问题,Facebook SDK 会打印其异常信息,因此请先检查该信息。


尝试过了。我得到了设置权限的窗口,但是LogCat中没有显示任何内容,用户也没有登录。 - Karlis
1
实际上这就是问题所在。但是Eclipse的LogCat没有显示任何错误,但当我在终端中运行adb logcat时,它显示了错误,结果发现我复制的代码缺少一个字符! - Karlis

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();
    }
}

这对我很有帮助。希望这也能对您有所帮助。

2
Facebook的Android登录快速入门底部有一个重要步骤。
对于Android 11及以上版本,应用程序需要为其想要了解的每个应用程序添加queries条目。否则,应用程序不会知道Facebook已安装,并且始终会打开自定义Chrome选项卡。
在您的AndroidManifest.xml查询中添加com.facebook.katana 条目。
<queries>
  <package android:name="com.facebook.katana" />
</queries> 

作为参考,我正在使用FB SDK 5.6


2

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

因此,在打开会话之前,我要求进行强制登录,即使用户已经从 Facebook 应用程序中打开了 Facebook 会话。

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

现在一切都正常工作,但用户必须手动输入数据。虽然不是最理想的方式,但它能够使用。

即使在打开Facebook应用程序的情况下,Facebook示例也无法正常工作。

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


1
如果哈希密钥未正确生成,则可能会遇到以下问题:
本机登录对话框显示,但在接受权限弹出窗口后,日志中什么也没有发生
但是,如果禁用设备上的本机应用程序(在这种情况下,登录对话框在 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());
        }

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


-1

enter image description here

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


1
我已经禁用了沙盒模式! - Karlis
沙盒模式不限制可以运行应用程序的设备,它只限制谁可以使用它。 - Simon Forsberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接