【问题标题】:Get publish_action permission after getting read permissions from Facebook从 Facebook 获取读取权限后获取 publish_action 权限
【发布时间】:2014-04-09 23:03:40
【问题描述】:

我正在将Facebook 登录集成到我的应用程序中。我能够获得读取权限,但如何从 Facebook SDK 获得发布权限。

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

@Override
public void onClick(View v) {
Session currentSession = Session.getActiveSession();
if (currentSession == null
    || currentSession.getState().isClosed()) {
    Session session = new Session.Builder(context).build();
    Session.setActiveSession(session);
    currentSession = session;
}

if (currentSession.isOpened()) {
    // Do whatever u want. User has logged in

} else if (!currentSession.isOpened()) {
    // Ask for username and password
    OpenRequest op = new Session.OpenRequest((Activity) context);

    op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
    op.setCallback(null);

    List<String> permissions = new ArrayList<String>();
    permissions.add("user_likes");
    permissions.add("email");
    permissions.add("user_birthday");
    permissions.add("user_location");
    permissions.add("user_interests");
    permissions.add("friends_birthday");
    op.setPermissions(permissions);

    Session session = new Builder(MainActivity.this).build();
    Session.setActiveSession(session);
    session.openForRead(op);
    }
}
});

如果用户授予权限,我就可以得到access_token 并在onActivityResult 上做我的事情。这是我正在做的:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
    Session.getActiveSession().onActivityResult(this, requestCode,
            resultCode, data);

Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
    Session session = new Session.Builder(context).build();
    Session.setActiveSession(session);
    currentSession = session;
}

if (currentSession.isOpened()) {
    Session.openActiveSession(this, true, new Session.StatusCallback() {

    @Override
    public void call(final Session session, SessionState state,
        Exception exception) {

        if (session.isOpened()) {

        Request.executeMeRequestAsync(session,
            new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user,
                    Response response) {
                if (user != null) {

                    TextView welcome = (TextView) findViewById(R.id.welcome);
                    TextView access_token_txt = (TextView) findViewById(R.id.access_token);
                    TextView email_txt = (TextView) findViewById(R.id.email);                                           

                    access_token = session.getAccessToken();
                    firstName = user.getFirstName();
                    fb_user_id = user.getId();                                          

                    access_token_txt.setText(access_token);

                    JSONObject graphResponse = response
                        .getGraphObject().getInnerJSONObject();

                    fbEmail = null;
                    try {
                        fbEmail = graphResponse.getString("email");

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    email_txt.setText(fbEmail);                                         
                    }
                }
            });
        }
    }
});
}
}

我已阅读Facebook Developer 文档,如此处Permissions - Facebook Developers 所述,我无法要求具有读取权限的发布权限。

第一个用户必须请求读取,当用户自动完成时,我们可以请求发布权限。

如何在用户授予读取权限后从 Facebook 登录获取发布权限。

我们将不胜感激。

【问题讨论】:

  • 我卡在登录 Facebook 上。我可以在本机应用程序可用时登录,但如果本机应用程序不可用,我无法登录和授权应用程序。这是我的问题,你能提供答案吗? [stackoverflow.com/questions/21336314/…
  • 我已经对你的问题发表了评论,试试看,如果可行就回复。

标签: android facebook facebook-android-sdk facebook-authentication


【解决方案1】:

我已经得到了我的问题的答案。只需在获得读取权限后打开会话,然后请求发布权限。这是我所做的:

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private boolean pendingPublishReauthorization = false;

将此添加到您的onActivityResult

Session session = Session.getActiveSession();

    if (session != null) {

        // Check for publish permissions
        List<String> permissions = session.getPermissions();
        if (!isSubsetOf(PERMISSIONS, permissions)) {
            pendingPublishReauthorization = true;
            Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
                    this, PERMISSIONS);
            session.requestNewPublishPermissions(newPermissionsRequest);
            return;
        }
    }

同样把这个方法集成到代码中:

private boolean isSubsetOf(Collection<String> subset,
        Collection<String> superset) {
    for (String string : subset) {
        if (!superset.contains(string)) {
            return false;
        }
    }
    return true;
}

通过执行这些操作,我可以同时获得读取和发布权限。

希望这对其他人有所帮助。

【讨论】:

  • 但是它再次打开了登录框,从用户的角度来看,这很简单,不能接受。我可以通过用户重新输入用户名和密码来做到这一点吗?
  • @jeevs 我认为再次显示弹出窗口比重新输入 Facebook 登录的用户名和密码要好。我正在努力让它有一个适当的流程,比如不显示 onActivityResult() 上的弹出窗口。
  • 那个弹窗是facebook SDK的登录弹窗,而后台发帖,所以没用。为什么在帖子已经发布时我们需要该登录弹出窗口。
  • 小建议:!permissions.containsAll(PERMISSIONS)
  • 同样从 2014 年 5 月起,您应该在应用设置页面上请求发布权限,developers.facebook.com/docs/apps/review
【解决方案2】:

从 facebook sdk 3.0 文档中,您不能同时授予阅读和发布权限。但是,一旦您稍后打开具有读取权限的会话,您就可以通过 UiLifecycleHelper 类更新此会话以发布权限。一旦会话状态更改为 SessionState.OPENED_TOKEN_UPDATED 意味着会话已更新并具有发布权限。下面是示例代码,希望对您有所帮助。

public class Example {
    private static final int REAUTH_ACTIVITY_CODE = 100;
    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream");
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_submit_post);
    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);
    publishStory();
}

private Session.StatusCallback callback = new Session.StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if (exception != null) {
            new AlertDialog.Builder(SubmitPost.this)
                    .setMessage(exception.getMessage())
                    .setPositiveButton("OK", null).show();
        } else {
            SubmitPost.this.onSessionStateChange(session, state, exception);
        }
    }
};

private void onSessionStateChange(Session session, SessionState state, Exception exception) {

 if (state.isOpened()) {
            if (pendingAnnounce && state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
                // Session updated with new permissions so try publishing once more.
                pendingAnnounce = false;
                //call your method here to publish something on facebook 
                publishStory();
            }
        }
    }

private void requestPublishPermissions(Session session) {
    if (session != null) {
        pendingAnnounce = true;
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);

        newPermissionsRequest.setRequestCode(REAUTH_ACTIVITY_CODE);
        Session mSession = Session.openActiveSessionFromCache(this);
        mSession.addCallback(callback);
        mSession.requestNewPublishPermissions(newPermissionsRequest);
    }
}

private void publishStory() {

    // Check for publish permissions
    List<String> permissions = this.session.getPermissions();
    if (!permissions.containsAll(Arrays.asList(PERMISSIONS ))) {
        this.requestPublishPermissions(this.session);
        this.is_return = true;
        return;
    }

    Session session = Session.getActiveSession();
    if (session != null) {
        CreateFBPost();
    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    uiHelper.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case REAUTH_ACTIVITY_CODE:
        Session session = Session.getActiveSession();
        if (session != null) {
            session.onActivityResult(this, requestCode, resultCode, data);
        }
        break;
    }
}

【讨论】:

  • 你能告诉我如何更新我的代码以获得该权限吗?这将非常有帮助。
  • // 检查发布权限 List permissions = this.session.getPermissions(); if (!permissions.containsAll(Arrays.asList(PERMISSIONS ))) { this.requestPublishPermissions(this.session); this.is_return = true;返回;这段代码将检查您是否获得权限,如果是,将调用 publishStory 否则 requestPublishPermissions 方法将在您的会话中添加权限
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多