gpt4 book ai didi

android - 在 requestNewReadPermissions 然后 requestNewPublishPermissions 之后未调用 StatusCallback

转载 作者:IT老高 更新时间:2023-10-28 23:00:49 26 4
gpt4 key购买 nike

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

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

从技术上讲,这将是:

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

1。验证用户身份

我调用 Session.openActiveSession()Session.StatusCallback (我已经事先检查过没有 Activity 的打开 session ):

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() session 和re-open it from cache ?

附加信息

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

最佳答案

这是一个错误。

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

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

Session.openActiveSessionFromCache(myContext);

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

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

关于android - 在 requestNewReadPermissions 然后 requestNewPublishPermissions 之后未调用 StatusCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14037010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com