如果我的应用程序中的facebook会话/令牌无效,该怎么办?

时间:2013-06-12 07:06:02

标签: android facebook session

我是适用于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 ?
   }

1 个答案:

答案 0 :(得分:3)

您可以在任何您想要的活动中使用UiLifecycleHelper,只需创建一个新活动(它将自动开始使用活动会话)。如果您正在使用活动会话,那么它是在所有Activity实例中保留的静态,因此您只需调用Session.getActiveSession()即可从任何活动访问它。只要您的某个活动已打开会话,您就可以在其他活动中使用它。

  1. 如果您的会话为空,只需创建一个新会话并将其设置为活动会话(或调用openActiveSession()方法之一)。如果用户已经授权您的应用程序,它将直接进入打开状态**并且您将能够使用它。如果它关闭了同样的事情。如果用户尚未授权您的应用,则session.isOpened和session.isClosed都将返回false,您应该将其重定向到您的登录活动。

  2. 我不太清楚如何回答这个问题。如果您没有访问令牌,则需要打开会话并获取发布权限。现在真正解决这个问题。

  3. 是的,无论何时打开会话或从活动或片段请求新权限,您都必须覆盖onActivityResult,并将所有内容传递给您正在对其进行操作的会话。然后会话将调用您在其中注册的StatusCallback(或UiLifecycleHelper)。

  4. **注意:只有缓存数据(SDK自动保存)才会自动打开。但是,如果调用session.closeAndClearTokenInformation,则将清除缓存,并提示用户再次授权。

    编辑 - 回答进一步的问题:

    1. 是的,你可以使用它。如果用户先前已登录,则会话将使用缓存数据自动填充并立即进入OPENED状态(只要您以前未调用closeAndClearTokenInformation)。您的所有权限/访问令牌都将保留。您还可以使用Session.openActiveSessionFromCache方法,如果返回null,则表示我们无法从缓存创建打开的会话(由于多种原因),您应该提示用户重新登录。 / p>

    2. 默认情况下,用户访问令牌的持续时间为60天(我相信),如果您使用SDK提供的Request类生成图表请求,它会在您过期时为您自动扩展令牌。如果用户更改了密码或删除了您的应用程序(或许多其他内容),访问令牌将变为无效,他们必须重新登录并重新授权您的应用程序。请参阅this page了解如何处理常见错误。

    3. 看起来很好。在调用requestNewPublishPermissions之前,您需要先确保您创建的会话首先处于打开状态。

相关问题