我是 Android 版 Facebook SDK (3.0.1) 的初学者,我想知道很多我在官方文档中找不到的问题。
在 facebook 示例中,为了请求新权限,他们在与登录活动相同的活动中使用 UILifeCyclerHelper。我的情况有点不同。
在我的情况下,我在第一个活动中登录用户,然后,稍后,我请求在其墙上发布的权限。
1) 我想知道当会话为空、关闭或处于不允许我请求这些权限的其他状态时该怎么办。
2)因为墙上的发布是由我的服务器稍后完成的,所以我需要发送用户访问令牌。同样,如果此令牌为 null / invalid 我该怎么办?
3)我目前正在询问如下权限。我该怎么做才能回调用户的回答?这是发生在 onActivityResult 吗?返回什么样的答案?
提前,感谢您的帮助!
Session session = Session.getActiveSession();
if (session != null){
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
}
else{
launchPublishWallTask();
}
private static final List<String> PERMISSIONS = Arrays.asList("publish_stream");
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
编辑(回答李明的回答):
感谢您的回答...但是有些地方我又不明白了。
1)如果我的会话是空的,你是说简单地这样做吗?
if (session == null){
session = new Session(this.getSherlockActivity());
Session.setActiveSession(session);
}
通过这样做,用户将不得不再次登录,不是吗?权限将从这个新的 Session 对象中消失,即使用户之前已经接受了它,不是吗?
2)我读过用户访问令牌仅在 2 小时内有效,并且在某些情况下无效,例如用户重置密码。因此,通过重新创建会话对象(上面的问题 1),即使我拥有会话对象和权限,是否也确定我将拥有一个有效的用户访问令牌?
3) 好的,谢谢
继续我的问题,在我的情况下,这是一个“仅”做的好方法吗(我没有在这里复制 onActivityResult 方法,但这没关系):
public void onClick(View v){
// Retrieve Facebook session object
Session session = Session.getActiveSession();
if (session == null){
session = new Session(this.getSherlockActivity());
Session.setActiveSession(session);
}
session.addCallback(this);
if (session != null){
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
this, PERMISSIONS
);
session.requestNewPublishPermissions(newPermissionsRequest);
}
else{
launchPublishWallTask();
}
}
}
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session != null && isSubsetOf(PERMISSIONS, session.getPermissions())){
launchPublishWallTask();
}
else{
Toast.makeText(getSherlockActivity(), "you have to accept !", Toast.LENGTH_LONG).show();
}
}
private void launchPublishWallTask(){
// Here, I'm sure that I will have a valid Session.getActiveSession().getAccessToken() .. or not ?
}