条件:安装了本机 Facebook apk 但已注销的 Android 设备。
每次满足此条件并且用户尝试使用 Facebook 的LoginButton或手动登录(见下文)时,登录后,Facebook SDK 总是会请求访问用户数据的权限,即使用户已经授予权限.
这是我在我的应用程序上实现的代码:
版本 1 - 登录按钮:
XML:
<com.facebook.widget.LoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
爪哇:
private static final List<String> PERMISSIONS = Arrays.asList("email", "user_groups");
private UiLifecycleHelper uiHelper;
@Override
protected void onCreate(Bundle savedInstanceState){
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions(PERMISSIONS);
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
//modify interface or something
}
};
版本 2 - 手动
XML:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:onClick="buttonOnClick"
android:text="Login" />
爪哇:
private static final List<String> PERMISSIONS = Arrays.asList("email", "user_groups");
public void buttonOnClick(View v) {
System.out.println("botaoOnClick");
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
System.out.println("session: " + session);
session.openForRead(new Session.OpenRequest(this).setPermissions(PERMISSIONS).setCallback(callback));
}
else {
Session.openActiveSession(this, true, callback);
}
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
//modify interface or something
}
};
即使是 sdk 附带的示例应用程序也以这种方式工作,但我已经看到其他一些应用程序(例如 Foursquare)以我认为的自然行为方式工作(仅在用户尚未授予权限时才请求权限)。
那么,有没有人知道达到预期结果的方法?最好不要编辑 Facebook SDK 本身。
提前致谢!
编辑1:附加信息:在回调方法上检查会话变量时,满足上述条件时,权限始终为空。如果用户拒绝授予权限(不是第一次),并尝试再次登录,会话将具有用户在过去一段时间内已经授予的权限,正如预期的那样。
编辑 2(2013 年 6 月 28 日):我决定上传一段重现该问题的视频,因为我不太确定每个人都理解我在解释中的意思。