0

我是 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 ?
   }
4

1 回答 1

3

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

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

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

  3. 是的,每当您打开会话或从活动或片段请求新权限时,您都必须覆盖 onActivityResult,并将所有内容传递到您所针对的会话。然后会话将调用您注册的 StatusCallback(或 UiLifecycleHelper)。

** 注意:只有缓存数据(SDK 自动保存)才会自动打开。但是,如果调用 session.closeAndClearTokenInformation,那么缓存会被清除,并且会提示用户重新授权。

编辑 - 回答更多问题:

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

  2. 默认情况下,用户访问令牌持续 60 天(我相信),如果您使用 SDK 提供的 Request 类发出图形请求,如果令牌过期,它将自动为您扩展令牌。如果用户更改密码或删除您的应用程序(或其他一些事情),访问令牌将失效,他们必须重新登录并重新授权您的应用程序。有关如何处理常见错误的信息,请参阅此页面。

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

于 2013-06-12T16:37:15.827 回答