【发布时间】:2012-12-26 06:53:50
【问题描述】:
我正在开发一个与 Facebook 集成的 Android 应用程序。我想:
- 让用户使用 Facebook 登录
- 在 Facebook 上获取用户的电子邮件地址(可以是 proxied email address,这很好)
- 代表他/她发布到用户的墙上/时间线
从技术上讲,这将是:
- 验证用户身份
- 请求
emailpermission - 请求
publish_streampermission
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;
}
/* ... */
}
由于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 中有说明。
【问题讨论】:
标签: android facebook facebook-authentication facebook-android-sdk