5

我正在尝试将新的 Facebook SDK 3.0 实施到我的 Android 应用程序中,但遇到了问题。我遇到的问题是要求用户再次登录以授予发布(“post_to_wall”)权限,即使用户已经登录并具有读取权限。仅当用户未安装 FB 应用程序时才会发生这种情况。如果他安装了 FB 应用程序,则只要求他授予权限。

这就是我实现登录的方式:

public void login(Activity activity) {
    Session session = Session.getActiveSession();

    if (session == null || !session.isOpened()) {
        openActiveSession(activity, true, sessionStatusCallback);
    }
}

private Session openActiveSession(final Activity activity, final boolean allowLoginUI, final StatusCallback callback) {
    return openActiveSession(activity, allowLoginUI, new OpenRequest(activity).setCallback(callback));
}

private Session openActiveSession(final Context context, final boolean allowLoginUI, final OpenRequest openRequest) {
    Session session = new Builder(context).setApplicationId(FACEBOOK_APPLICATION_ID).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

这是回调的调用方法:

public void call(final Session session, final SessionState state, final Exception exception) {
    if (session.isOpened()) {
        if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
            // code if new permissions have been granted
        } else {
            // code for login
        }
    } else if (session.isClosed()) {
            // code for user canceled login
        } else if (exception != null) {
            // code if there were errors during login 
        }
    }
}

这是我添加到调用登录的活动的 onActivityResult 方法的代码:

Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data);

这就是我要求新权限的方式:

Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {    
    if (DONT_HAVE_PERMISSIONS) {
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity,
                            FACEBOOK_PERMISSIONS).setRequestCode(FACEBOOK_AUTHORIZE_ACTIVITY_CODE);
        session.requestNewPublishPermissions(newPermissionsRequest);
    }
}

我试图找出更多关于这个问题的信息,但我只发现了一些暗示这是有意的,但我还没有找到任何具体的东西。

这是默认行为吗?如果是这样,有没有办法解决它?或者,也许我做错了什么?

谢谢您的帮助。

4

2 回答 2

1

更新您的 SDK 版本;此问题已在Facebook Android SDK v3.0.1中得到解决。

于 2013-06-25T03:37:28.663 回答
0

查看 facebook 的源代码,我认为应该可以开始尝试直接获取权限,因为登录和权限类派生自同一个 AuthorizationRequest 类,而 AuthorizationRequest 类完成所有工作,就像所有工作一样。Session.NewPermissionsRequest 类只是创建了一些私有方法,在 AuthorizationRequest 类中公开,就是这样!他们还不如让我们直接访问 AuthorizationRequest。新的 facebook API 似乎没有任何形式的“OnFailed/OnSuccess”回调,所以我最终有一个状态机来记住启动 facebook 的目标(登录、权限、获取朋友列表......),并且我在哪一步。

我没试过我说的。如果我这样做,我会更新答案。如果您尝试直接启动 Session.NewPermissionsRequest 而无需登录,请告诉我!

更新

正如我上面解释的那样,我只要求提供一次凭据。

  1. 转到 src/com/facebook/Sessions.java
  2. 在第 862 行你会发现

    private static Session openActiveSession(Context context, boolean allowLoginUI, OpenRequest openRequest)
    
  3. 使其成为公共功能并保存。

现在而不是创建 Session.NewPermissionsRequest 对象。制作 Session.OpenRequest

        permisions = new ArrayList<String>();
        permisions.add("user_photos");
        permisions.add("friends_photos");
        Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(
                activity, permisions);
        request.setCallback(helper);

        if (Session.getActiveSession() != null)
            Session.getActiveSession().requestNewReadPermissions(request);
        else {
            Session.OpenRequest orequest = new Session.OpenRequest(activity);
            orequest.setPermissions(permisions);
            orequest.setCallback(helper);
                            // its now public so you can call it
            Session.openActiveSession(act, true, request);
        }

现在确保你设置了一个回调,一个重要的原因

@Override
public void call(Session session, SessionState state, Exception exception) {
    if (state.isClosed()) {
                    // we are doing unofficial stuff so we loose guarantees.
                    // Set the active session to null if we logout or user cancels
                    // logging in. If you don't do this, the second time it will result
                    // in a crash.
        Session.setActiveSession(null);
    }
}

现在它将直接要求所有权限并一次性登录。

于 2013-02-06T23:24:12.650 回答