【问题标题】:StatusCallback not called after requestNewReadPermissions then requestNewPublishPermissions在 requestNewReadPermissions 然后 requestNewPublishPermissions 之后未调用 StatusCallback
【发布时间】:2012-12-26 06:53:50
【问题描述】:

我正在开发一个与 Facebook 集成的 Android 应用程序。我想:

  1. 让用户使用 Facebook 登录
  2. 在 Facebook 上获取用户的电子邮件地址(可以是 proxied email address,这很好)
  3. 代表他/她发布到用户的墙上/时间线

从技术上讲,这将是:

  1. 验证用户身份
  2. 请求email permission
  3. 请求publish_stream permission

1。验证用户身份

我用Session.StatusCallback 打电话给Session.openActiveSession()(我已经事先检查过没有活动的打开会话):

final Session.StatusCallback sessionStatusCallback = new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
        // If there is an exception...
        if(exception != null)
        {
            // Handle fail case here.
            return;
        }

        // If session is just opened...
        if(state == SessionState.OPENED)
        {
            // Handle success case here.
            return;
        }
    };
};

// Start Facebook Login.
Session.openActiveSession(activity, true, sessionStatusCallback);

成功登录后调用我的回调。到目前为止一切顺利。

2。请求email permission

这是我的状态回调:

new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
        // If there is an exception...
        if(exception != null)
        {
            // Handle fail case here.
            return;
        }
        
        // If token is just updated...
        if(state == SessionState.OPENED_TOKEN_UPDATED)
        {
            // Handle success case here.
            return;
        }
    };
};

我通过Session.requestNewReadPermissions()请求许可:

final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_READ = {"email"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_READ);

// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
    // Handle success case here.
    return;
}

// Request permissions.
session.requestNewReadPermissions(new Session.NewPermissionsRequest(activity, permissionList));

在授予权限后调用我的回调。到目前为止一切顺利。

3。请求publish_stream permission

这是我的状态回调:

new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
        // If there is an exception...
        if(exception != null)
        {
            // Handle fail case here.
            return;
        }
        
        // If token is just updated...
        if(state == SessionState.OPENED_TOKEN_UPDATED)
        {
            // Handle success case here.
            return;
        }
    };
};

我通过Session.requestNewPublishPermissions()请求许可:

final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_PUBLISH = {"publish_stream"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_PUBLISH);

// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
    // Handle success case here.
    return;
}

// Request permissions.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(activity, permissionList));

这一次,我的回调是在获得权限后调用的。

调查

经过进一步调查,发现我的回调是由com.facebook.Session#postStateChange(SessionState, SessionState, Exception)触发的:

void postStateChange(final SessionState oldState, final SessionState newState, final Exception exception) {
    if (oldState == newState && exception == null) {
        return;
    }

    /* ... */
}

由于oldStatenewState 相等(都是SessionState.OPENED_TOKEN_UPDATED,所以我的回调没有被调用。

问题

在第二次获得许可后,我如何才能收到任何通知?我应该close() 会话和re-open it from cache 吗?

附加信息

我的 Facebook Android SDK 3.0 是从 here 下载的,在 Facebook 的 Getting Started with the Facebook SDK for Android 中有说明。

【问题讨论】:

    标签: android facebook facebook-authentication facebook-android-sdk


    【解决方案1】:

    这是一个错误。

    [编辑:正如 Guy 在 cmets 中指出的那样,这已在 3.0.1 中修复,因此不再需要此解决方法]

    您提到的解决方法基本上是正确的,尽管您不需要调用 close。如果您使用的是单个活动会话,则在调用 requestNewPublishPermissions() 之前只需调用:

    Session.openActiveSessionFromCache(myContext);
    

    如果使用多个会话,需要用TokenCachingStrategy初始化一个新的Session,验证它是否处于CREATED_TOKEN_LOADED状态,然后调用openForRead(null);

    完成其中一项后,requestNewPublishPermissions() 应在完成后调用您的通知。

    【讨论】:

    • 我整理了几篇文章(herehere),其中考虑了 @rightparen 的解决方法介绍,并全面解释了如何开始打开 ​​Facebook 会话并请求其他权限。
    • 在最新的 FB SDK 3.0.1 中不再出现这种情况,也不再需要调用openActiveSessionFromCache
    • 我有最新的 3.0.1,我什至尝试添加这一行,但什么也没有。我没有收到回电,但如果我事后检查权限,它会起作用。让我发疯
    • 嘿,我遇到了类似的问题。你能告诉我我可以把代码行放在哪里吗?我的代码中没有使用方法requestNewPublishPermissions()。所以我有点困惑。请指导我。
    【解决方案2】:

    基于rightparen's answer的工作代码

    在第二次请求权限之前(即在Session.requestNewPublishPermissions() 之前),请执行以下操作:

    // Re-initialize Facebook session.
    session.removeCallback(sessionStatusCallback);          // Remove callback from old session.
    session = Session.openActiveSessionFromCache(context);  // Create new session by re-opening from cache.
    session.addCallback(sessionStatusCallback);             // Add callback to new session.
    

    代码仍然基于 Facebook Android SDK 3.0,如问题所示。

    【讨论】:

      【解决方案3】:

      我遇到的另一件事是我的 NewPermissionRequest 的 requestCode 没有设置为我用来打开 Session 以进行读取的相同 requestCode,因此我的 Session.StatusCallback 在新的已授予权限。

      例如,在我的onActivityResult 中,我检查了 requestCode 并相应地委派了调用,因为我有其他东西进入这个方法。

      public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
          if (requestCode == FACEBOOK_AUTH_RESULT_CODE) {
              Session session = Session.getActiveSession();
              if(session != null) {
                  session.onActivityResult(activity, requestCode, resultCode, data);
              }
          }       
      }
      

      然后我用以下代码打开了我的Session

              Session.getActiveSession().openForRead(
                  new Session.OpenRequest(activity).
                      setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK).
                      setRequestCode(FACEBOOK_AUTH_RESULT_CODE).
                      setPermissions(MY_READ_PERMISSIONS));
      

      然后我在构造 NewPermissionRequest 时忘记使用相同的 requestCode。

      这就是正确的NewPermissionRequest 需要的样子:

              Session.getActiveSession().requestNewPublishPermissions(
                  new NewPermissionsRequest(activity, MY_PUBLISH_PERMISSIONS)
                      .setRequestCode(FACEBOOK_AUTH_RESULT_CODE));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-06
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多