我是适用于Android的Facebook SDK(3.0.1)的初学者,我想知道很多我在官方文档中找不到的问题。
在facebook示例中,要求新的权限,他们在与登录活动相同的活动中使用UILifeCyclerHelper。我的情况有点不同。
在我的情况下,我在第一个活动中登录用户,然后,稍后,我要求在其墙上发布权限。
1)我想知道当会话为空,关闭或处于不允许我提出这些权限的其他状态时该怎么做。
2)因为我的服务器稍后会在墙上发布,所以我需要发送用户访问令牌。同样,如果此令牌为空/无效,我该怎么办?
3)我目前正在问像bellow这样的权限。如何回复用户的答案我该怎么办?这是在ActivityResult上发生的吗?回复了什么样的答案?
每次前进,谢谢你的帮助!
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 ?
}
答案 0 :(得分:3)
您可以在任何您想要的活动中使用UiLifecycleHelper,只需创建一个新活动(它将自动开始使用活动会话)。如果您正在使用活动会话,那么它是在所有Activity实例中保留的静态,因此您只需调用Session.getActiveSession()即可从任何活动访问它。只要您的某个活动已打开会话,您就可以在其他活动中使用它。
如果您的会话为空,只需创建一个新会话并将其设置为活动会话(或调用openActiveSession()方法之一)。如果用户已经授权您的应用程序,它将直接进入打开状态**并且您将能够使用它。如果它关闭了同样的事情。如果用户尚未授权您的应用,则session.isOpened和session.isClosed都将返回false,您应该将其重定向到您的登录活动。
我不太清楚如何回答这个问题。如果您没有访问令牌,则需要打开会话并获取发布权限。现在真正解决这个问题。
是的,无论何时打开会话或从活动或片段请求新权限,您都必须覆盖onActivityResult,并将所有内容传递给您正在对其进行操作的会话。然后会话将调用您在其中注册的StatusCallback(或UiLifecycleHelper)。
**注意:只有缓存数据(SDK自动保存)才会自动打开。但是,如果调用session.closeAndClearTokenInformation,则将清除缓存,并提示用户再次授权。
编辑 - 回答进一步的问题:
是的,你可以使用它。如果用户先前已登录,则会话将使用缓存数据自动填充并立即进入OPENED状态(只要您以前未调用closeAndClearTokenInformation)。您的所有权限/访问令牌都将保留。您还可以使用Session.openActiveSessionFromCache方法,如果返回null,则表示我们无法从缓存创建打开的会话(由于多种原因),您应该提示用户重新登录。 / p>
默认情况下,用户访问令牌的持续时间为60天(我相信),如果您使用SDK提供的Request类生成图表请求,它会在您过期时为您自动扩展令牌。如果用户更改了密码或删除了您的应用程序(或许多其他内容),访问令牌将变为无效,他们必须重新登录并重新授权您的应用程序。请参阅this page了解如何处理常见错误。
看起来很好。在调用requestNewPublishPermissions之前,您需要先确保您创建的会话首先处于打开状态。