Android facebook 登录不适用于已安装的 Facebook 应用程序

Posted

技术标签:

【中文标题】Android facebook 登录不适用于已安装的 Facebook 应用程序【英文标题】:Android facebook login not working with installed Facebook app 【发布时间】:2013-07-25 10:30:45 【问题描述】:

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

对此进行了测试: 银河王牌 2.3.6 HTC 欲望 4.1.2 银河注 4.1.2 安卓模拟器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");
            
        
    );

【问题讨论】:

为什么Session session 是最终的? 这样我就可以在 onComplete 方法中获取例如用户访问令牌! 嘿,您是否在 Facebook 开发者页面上应用的基本信息选项卡中禁用了沙盒模式? 是的。我提到过,如果我在 Android 2.3.6 上测试一切正常,我会得到我的访问令牌,因为对于 Android 2.3,你会在输入用户凭据的地方获得和弹出对话框,但对于 Android 4.1,我没有得到那个对话框弹出! 是的,我已经设置了所有内容,它适用于旧设备,但不适用于 4.1 版本。我刚刚创建了干净的项目,并逐步完成了 Facebook 入门教程,同样 - 对于 2.3,我得到登录弹出窗口,一切正常,但对于 4.1,我被问到是否允许访问某些内容,仅此而已,我的数据不是t 显示! 【参考方案1】:

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

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

    如果你有一个android设备,Android 1.9.XFacebook App被安装在设备叫Native Login这里方法,你不需要使用facebookWebView

    如果您的 Android 设备中没有安装Facebook App,那么最好使用WebView

所以为此 Facebook 提供 3 Constants

    NATIVE_ONLY(仅在Facebook App中打开时使用) WEB_ONLY(仅当您想在WebView 中打开时使用) 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);

【讨论】:

【参考方案2】:

查看第 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 会打印其异常,因此如果有其他问题,请务必检查那里。

【讨论】:

试过这个。我得到了设置权限的窗口,但 LogCat 中没有显示任何内容,并且用户未登录 其实这就是问题所在。但是 Eclipse LogCat 没有显示任何错误,但是当我在终端中运行 adb logcat 时,它显示了错误,事实证明我复制的没有一个字符!【参考方案3】:

使用此功能为您获取哈希键(调试和发布 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();
    

这对我很有帮助。希望这对你也有帮助。

【讨论】:

【参考方案4】:

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

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

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

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

在打开 facebook 应用程序后,即使是 facebook 示例也不适合我。

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

【讨论】:

【参考方案5】:

如果没有正确生成哈希键,那么您可能会遇到类似的问题

会显示一个本地登录对话框,但在接受权限弹出窗口后,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());
        

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

【讨论】:

【参考方案6】:

Facebook's Login Quickstart for Android底部有一个重要的步骤。

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

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

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

我已禁用沙盒模式! 沙盒模式不限制可以运行应用程序的设备,它只限制可以使用它。

以上是关于Android facebook 登录不适用于已安装的 Facebook 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录不适用于 Facebook 应用程序

共享对话框不适用于 Facebook 应用 [android]

用于 Facebook 聊天的 Asmack 不适用于 PrivacyListManager

firebase 社交登录不适用于我的 android 设备,仅适用于网络

为啥 Facebook 登录不适用于我的免安装应用?

解析 Facebook 登录不适用于所有设备