如何避免在Android Facebook SDK中已经授权

时间:2010-12-21 02:39:04

标签: android facebook

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

  

“您已经授权happyapp。   按“好”继续。

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

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

有没有人知道任何解决方法?

5 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:5)

使用这里的建议,这是适合我的代码,希望它可以帮助某人

登录前执行此操作

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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