在requestNewReadPermissions然后requestNewPublishPermissions之后没有调用StatusCallback

时间:2012-12-26 06:53:51

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

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

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

    1. 验证用户
    2. 申请email permission
    3. 申请publish_stream permission
    4. 1。验证用户

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

      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中说明。

3 个答案:

答案 0 :(得分:10)

这是一个错误。

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

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

Session.openActiveSessionFromCache(myContext);

如果您正在使用多个会话,则需要使用TokenCachingStrategy初始化一个新会话,验证它是否处于CREATED_TOKEN_LOADED状态,并调用openForRead(null);

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

答案 1 :(得分: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,如问题所示。

答案 2 :(得分:0)

我遇到的另一件事是NewPermissionRequest的requestCode没有被设置为我用来打开我的Session for read with的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));