4

情况如下:

如果我之前通过以下方式授予了我的应用程序的读取权限

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));

然后,当我需要分享时,我通过以下方式请求发布权限:

LoginManager.getInstance().logInWithPublishPermissions(getActivity(), Arrays.asList("publish_actions"));

一切正常,直到我在 Web 中删除我的应用程序的权限。

如果应用程序被杀死或停止并且我需要共享,我将检查我是否仍然拥有权限:

if(userAuthorizedMyApp()){
    LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
} else {
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));
}

方法 userAuthorizedMyApp() 返回 false(accessToken null):

private boolean userAuthorizedMyApp() {
    boolean authorized;
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    if(DEBUG) Log.v(TAG, "accessToken [" + accessToken +"]");

    if(accessToken != null){
        Set<String> currentPermissions = accessToken.getPermissions();
        authorized = currentPermissions.contains("public_profile");
    } else {
        authorized = false;
    }
    if(DEBUG) Log.v(TAG, "userAuthorizedMyApp[" + authorized +"]");

    return authorized;
}

我尝试进行通常的登录,就好像这是第一次:

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));

我收到:

public void onError(FacebookException error)

onError,错误{HttpStatus:-1,errorCode:190,errorType:null,errorMessage:验证访问令牌时出错:用户尚未授权应用程序123456789123456。}

任何想法我做错了什么?

4

3 回答 3

3

打电话AccessToken.refreshCurrentAccessTokenAsync()对我有用。我在执行时遇到错误FacebookCallback.onError(),我调用 AccessToken.refreshCurrentAccessTokenAsync()它清除 Facebook SDK 中的访问令牌。

因为这是一个异步调用,所以我不能loginManager.logInWithReadPermissions()立即调用;没有回调,所以我AlertDialog向用户显示一个,当用户点击“确定”时,我打电话给loginManager.logInWithReadPermissions().

所以用户体验并不算太差,对于边缘情况也是可以接受的。

于 2015-07-06T08:24:34.117 回答
3

只需执行以下操作:

@Override
public void onError(FacebookException error) {
    Timber.e(error, "Error during facebook login");
    AccessToken.setCurrentAccessToken(null);
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"))
}
于 2016-03-01T10:48:16.593 回答
0

要进行正确的验证,请检查 accesstoken 是否为 null 或过期:

  AccessToken accessToken = AccessToken.getCurrentAccessToken();
  boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
     
  if (isLoggedIn) { 
      //Post Facebook.
  } else {
      manager.logIn(shareAct, Arrays.asList("public_profile"));
  }
于 2021-11-29T22:34:55.657 回答