Android facebook登录无法使用已安装的Facebook应用

时间:2013-07-25 10:30:45

标签: android facebook facebook-android-sdk facebook-sdk-3.0

我已经设置了简单的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");
            }
        }
    });

6 个答案:

答案 0 :(得分:8)

我正在为那些使用Facebook SDK 4.X

的人写这个答案

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

  1. 如果您的Android设备Android 1.9.XFacebook App已安装在名为Native Login方法的设备中,则无需使用facebook WebView

  2. 如果您尚未在Android设备中安装Facebook App,那么最好使用WebView

  3. 所以这个Facebook提供3 Constants

    1. NATIVE_ONLY(仅在Facebook App中打开时使用)
    2. WEB_ONLY(仅在WebView打开时使用)
    3. NATIVE_WITH_FALLBACK(如果未安装应用,推荐使用Facebook检测和操作webView
    4. 查看以下链接了解详情 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);
      

答案 1 :(得分:6)

使用此函数获取散列密钥(debug和release 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 :(得分:5)

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

如果您没有正确输入您的应用密钥哈希,Facebook通过WebView弹出窗口登录(如果未安装该应用程序)仍然有效,但通过原生Facebook应用程序登录则不会。

你应该在LogCat中看到这个例外:

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

Facebook SDK会打印出异常,因此无论如何都要检查是否存在其他问题。

答案 3 :(得分:2)

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

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

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

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

即使facebook的样本也没有为facebook app打开工作。

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

答案 4 :(得分:1)

如果没有正确生成散列键,那么您可能会遇到像

这样的问题

显示本机登录对话框,但在接受权限弹出后,日志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());
        }

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

答案 5 :(得分:-1)

enter image description here

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