【问题标题】:How to avoid already-authorized in Android Facebook SDK如何避免在 Android Facebook SDK 中已经授权
【发布时间】:2010-12-21 02:39:04
【问题描述】:

当我为 Facebook 的 Android SDK 使用单点登录时,我得到一个完全无用的页面。

"你已经授权happyapp。 按“确定”继续。

此页面会破坏用户体验。我怎么摆脱它。很多人都看到了这个,但没有发布解决方案。

即使 Facebook 也承认这是一个问题,请参阅:http://forum.developers.facebook.net/viewtopic.php?id=84548

有人知道解决办法吗?

【问题讨论】:

  • 链接已失效。
  • 是的,确实如此。互联网上的一切都应该移动。包括你的问题。
  • 我遇到了同样的问题,发现如果设备中没有安装原生 FB 应用程序,每次我发布到 FB 时都会显示“已授权”窗口,并通过安装原生 FB 应用程序得到解决

标签: android facebook


【解决方案1】:

我这样做的方式(没有额外的 OAuth 解决方案)是按照 Kieveli 的建议将访问令牌存储在首选项中。当主要活动开始时,从首选项中查找令牌,如果不存在则启动授权过程并将生成的令牌存储在首选项中。

更难的部分是处理应用程序的令牌过期或取消授权(即令牌在首选项中,但不再有效)。

对于这种情况,每次调用 FB API/图形时,检查是否有异常指示身份验证失败。如果失败,请重新启动授权/令牌存储过程。

【讨论】:

  • 所以将再次出现已经授权的对话框,所以这是我的鼻涕解决方案......这应该可以解决 Facebook 的问题......
【解决方案2】:

使用这里的建议,这是对我有用的代码,希望对某人有所帮助

在登录之前这样做

SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(FacebookLogin.this); 
                        String access_token = prefs.getString("access_token", null); 
                        Long expires = prefs.getLong("access_expires", -1);


                        if (access_token != null && expires != -1)
                        {
                            facebook.setAccessToken(access_token);
                            facebook.setAccessExpires(expires);
                        }


                        if (!facebook.isSessionValid())
                        {
                            facebook.authorize(FacebookLogin.this, new DialogListener() {
...

在您成功登录后执行此操作

String token = facebook.getAccessToken();
long token_expires = facebook.getAccessExpires();

SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(FacebookLogin.this);

prefs.edit().putLong("access_expires", token_expires).commit();

prefs.edit().putString("access_token", token).commit();

【讨论】:

  • 我认为您错过了问题的重点。您发布的代码可以正常工作,而颁发的 FB 访问令牌仍然有效(约 48 小时),但关键是在那之后会发生什么。就目前而言,在访问令牌过期后,您必须重新运行 Facebook 授权过程才能获得另一个令牌,这会迫使用户再次处理“您已经授权 X”对话框。参考文献在纯 Web 场景中,无需用户批准即可发布新的访问令牌。原生应用需要类似的流程。
  • 方法setAccessToken(), setAccessExpires(), getAccessExpires() - 已弃用;/
【解决方案3】:

在任何设备通过 Facebook 授权我的应用后,我遇到了这个问题。我的模拟器继续完美运行,但我无法让手机通过“好的”对话框屏幕并做任何有意义的事情。我在 authorize() 调用中添加了 facebook.FORCE_DIALOG_AUTH 参数。现在它要求我在每个设备上登录一次,并在共享首选项中设置令牌和过期时间。

Button button_facebook = (Button) findViewById(R.id.button_share_on_facebook);
button_facebook.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        if (access_token != null) {
            facebook.setAccessToken(access_token);
        }

        if (expires != 0) {
            facebook.setAccessExpires(expires);
        }

        if (!facebook.isSessionValid()) {
            facebook.authorize(YourActivity.this, new String[] { "user_photos,publish_checkins,publish_actions,publish_stream" }, facebook.FORCE_DIALOG_AUTH, new DialogListener() {
                @Override
                public void onComplete(Bundle values) {
                    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                    SharedPreferences.Editor editor = mPrefs.edit();
                    editor.putString("access_token", facebook.getAccessToken());
                    editor.putLong("access_expires", facebook.getAccessExpires());
                    editor.commit();
                    postSomethingToFacebook();
                }

                @Override
                public void onFacebookError(FacebookError e) {
                    Log.e("Facebook-Authorize", "FacebookError Error: " + e.getMessage());
                }

                @Override
                public void onError(DialogError e) {
                    Log.e("Facebook-Authorize", "DialogError Error: "   + e.getMessage());
                }

                @Override
                public void onCancel() {
                    Log.w("Facebook-Authorize", "Cancelled.");
                }
            });
        } else {
            postSomethingToFacebook();
        }
});

【讨论】:

    【解决方案4】:

    绕过 SDK 并使用您自己的 OAuth 解决方案。获取后保存访问令牌。尝试直接使用它而不将用户发送到 facebook 权限页面。令牌过期后,您将需要他们再次授予权限。高级功能带来了较低级别的职责(和更多工作)。

    【讨论】:

    • 我相信你。我害怕重新发明轮子,尤其是使用 OAuth。您对 Android + Facebook + OAth 有什么建议吗?
    • 我将 Scribe 用于非 Android 应用程序。
    【解决方案5】:

    如果您的设备中没有 FB 应用程序,则意味着弹出窗口将出现在您的 Safari 浏览器中。 在您的设备中安装 FB 应用程序并尝试使用 FB 登录,但未出现已授权的屏幕。 谢谢。

    【讨论】:

    • 我已经安装了应用,但它仍然显示该页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2017-08-25
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多