我正在开发一款与Facebook集成的Android应用程序。我想:
从技术上讲,那将是:
email
permission publish_stream
permission 我用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);
成功登录后调用我的回调。到目前为止一切都很好。
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));
在授予权限后调用我的回调。到目前为止一切都很好。
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;
}
/* ... */
}
由于oldState
和newState
相等(均为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中说明。
答案 0 :(得分:10)
这是一个错误。
[编辑:正如Guy在评论中指出的那样,这已在3.0.1中修复,因此不再需要此解决方法]
您提到的解决方法基本上是正确的,但您不需要调用close。如果您正在使用单个活动会话,则在调用requestNewPublishPermissions()之前只需调用:
Session.openActiveSessionFromCache(myContext);
如果您正在使用多个会话,则需要使用TokenCachingStrategy初始化一个新会话,验证它是否处于CREATED_TOKEN_LOADED状态,并调用openForRead(null);
执行其中之一后,requestNewPublishPermissions()应在完成后调用您的通知。
答案 1 :(得分:2)
在第二次请求许可之前(即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));