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

Pan*_*ang 22 android facebook facebook-authentication facebook-android-sdk

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

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

从技术上讲,这将是:

  1. 验证用户
  2. 请求email许可
  3. 请求publish_stream许可

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);
Run Code Online (Sandbox Code Playgroud)

成功登录后调用我的回调.到现在为止还挺好.

2.请求email许可

这是我的状态回调:

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;
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

我请求许可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));
Run Code Online (Sandbox Code Playgroud)

授予权限后调用我的回调.到现在为止还挺好.

3.申请publish_stream许可

这是我的状态回调:

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;
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

我请求许可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));
Run Code Online (Sandbox Code Playgroud)

这次,在授予权限后不会调用我的回调.

调查

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

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

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

因为oldState并且newState是相等的(两者都是SessionState.OPENED_TOKEN_UPDATED,我的回调没有被调用.

如何在第二次授予许可后收到任何通知?我应该参加close()会话并从缓存中重新打开它吗?

附加信息

我的Facebook Android SDK 3.0可以从这里下载,这在Facebook的Facebook SDK for Android入门中有所说明.

rig*_*ren 10

这是一个错误.

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

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

Session.openActiveSessionFromCache(myContext);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我已经汇总了几篇文章([这里](http://adilatwork.blogspot.co.uk/2013/02/facebook-android-sdk-30-opening-session.html)和[这里](http ://adilatwork.blogspot.co.uk/2013/02/facebook-android-sdk-30-requesting.html))采取@ rightparen的解决方案介绍考虑并完全解释开始开设Facebook会话并请求其他权限. (2认同)