4

重新请求之前拒绝的 Facebook 许可的正确方法是什么?

假设一个应用程序请求读取权限,例如user_photos. 用户拒绝任务 A。

他们继续使用该应用程序,但遇到需要相同权限的任务 B user_photos,但这次用户愿意提供 Facebook 权限。

鉴于这种行为,我再次向用户请求此权限,并且使用 Android Facebook SDK,这是使用requestNewReadPermissionsAPI 完成的:

  session.requestNewReadPermissions(
    new Session.NewPermissionsRequest(this,PERMISSION_USER_PHOTOS));

但是,此调用似乎仅在打开 Facebook 会话(例如在 中之后才起作用,如下所示:Session.StatusCallback

public void call(Session session, SessionState state, Exception e) {
    if (session.isOpened()) {
        if (session.getDeclinedPermissions().contains("user_photos")) {
            session.requestNewReadPermissions(new Session.NewPermissionsRequest(this,
            "user_photos"));
            return;
        }
        // ...
    } else if (session.isClosed()) {
        // ...
    }
}

由于之前已经请求并拒绝了此权限,因此我们第一次使用所需权限打开 Facebook 会话,如下所示:

if (session != null && !session.isOpened() && !session.isClosed()) {
    session.openForRead(new Session.OpenRequest(this)
        .setPermissions(PERMISSION_USER_PHOTOS)
        .setCallback(this));
}

Facebook 抛出一个微调器和一个原生对话框,但立即返回(没有向用户显示权限窗口),说权限被拒绝(因为这不被认为是“重新请求”)。

然后它进入会话状态回调,(如前面的代码片段所示),我检查权限是否被拒绝,并请求新的读取权限。它使用 FB 原生对话框再次抛出一个微调器,但现在最终显示原生权限 FB 权限窗口,让用户可以选择再次接受/拒绝。

我的问题:

  1. 如果我知道该权限已被拒绝一次,是否可以使用“新”读取权限打开会话?我找不到 session.openForRead()使用此“新权限”标志的任何变体打开 Facebook 会话的方法。
  2. 如果1.不可能,有没有办法可以避免整个舞蹈:
    微调器↣弹出(但立即返回) ↣微调器↣显示重新请求弹出

我没有使用“Facebook 按钮”,而是使用 FB 文档中推荐的自定义 UI 方法。具体来说,我正在使用一个片段UiLifecycleHelper来管理我的 Facebook 生命周期调用。这是我的 FB 生命周期片段的代码(如果这与解决问题有关):

public abstract class FacebookLifecycleFragment
  extends BaseFragment
  implements Session.StatusCallback {

    private UiLifecycleHelper _uiLifecycleHelper;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _uiLifecycleHelper = new UiLifecycleHelper(getActivity(), this);
        _uiLifecycleHelper.onCreate(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        _uiLifecycleHelper.onResume();
    }

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

    @Override
    public void onPause() {
        super.onPause();
        _uiLifecycleHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        _uiLifecycleHelper.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        _uiLifecycleHelper.onSaveInstanceState(outState);
    }
}

LoginFbFragment因此,我有PublishFbPhotoFragment等片段,它们在开始时执行“权限请求 + Facebook 上所需的操作”调用(或该片段上按钮的触发器)。

4

0 回答 0