重新请求之前拒绝的 Facebook 许可的正确方法是什么?
假设一个应用程序请求读取权限,例如user_photos
. 用户拒绝任务 A。
他们继续使用该应用程序,但遇到需要相同权限的任务 B user_photos
,但这次用户愿意提供 Facebook 权限。
鉴于这种行为,我再次向用户请求此权限,并且使用 Android Facebook SDK,这是使用requestNewReadPermissions
API 完成的:
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 权限窗口,让用户可以选择再次接受/拒绝。
我的问题:
- 如果我知道该权限已被拒绝一次,是否可以使用“新”读取权限打开会话?我找不到
session.openForRead()
使用此“新权限”标志的任何变体打开 Facebook 会话的方法。 - 如果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 上所需的操作”调用(或该片段上按钮的触发器)。