Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 验证访问令牌时出错:用户未授权应用程序。Facebook SDK 4_Android_Facebook_Facebook Sdk 4.0_Facebook Permissions - Fatal编程技术网

Android 验证访问令牌时出错:用户未授权应用程序。Facebook SDK 4

Android 验证访问令牌时出错:用户未授权应用程序。Facebook SDK 4,android,facebook,facebook-sdk-4.0,facebook-permissions,Android,Facebook,Facebook Sdk 4.0,Facebook Permissions,情况如下: 如果我以前通过向应用程序授予读取权限 LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email")); 然后,当我需要共享时,我通过以下方式请求发布权限: LoginManager.getInstance().logInWithPublishPermissions(getActivity(), Arrays.asList("publish_actions")); 在我删除Web应用

情况如下:

如果我以前通过向应用程序授予读取权限

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):

我收到:

public void onError(FacebookException error)
OneError,错误{HttpStatus:-1,错误代码:190,错误类型:null,错误消息:验证访问令牌时出错:用户未授权应用程序123456789123456。}


知道我做错了什么吗?

调用
AccessToken.refreshCurrentAccessTokenAsync()
对我来说很有效。我在
FacebookCallback.onError()的实现中得到错误,我在其中调用
AccessToken.refreshCurrentAccessTokenAsync()
,用于清除Facebook SDK中的访问令牌

因为这是一个异步调用,所以我无法立即调用
loginManager.logInWithReadPermissions()
;没有回调,因此我向用户显示一个
AlertDialog
,当用户单击“确定”时,我调用
loginManager.logInWithReadPermissions()


因此,用户体验并不太差,对于边缘情况来说也是可以接受的

只需执行以下操作:

@Override
public void onError(FacebookException error) {
    Timber.e(error, "Error during facebook login");
    AccessToken.setCurrentAccessToken(null);
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"))
}

当您遇到此错误时,是否可以尝试清除访问令牌LoginManager.logout(),然后重新登录?实际上,通过第二次执行相同的操作,一切正常-登录屏幕打开。但是第一次尝试出错会让用户感到困惑。请记住,访问令牌是缓存在客户端上的,因此除非您确实发出请求,否则无法验证它是否仍然有效。这里发生的情况是,在失败的情况下,您正在调用loginWithPublishPermissions(本质上是请求额外的perm,当您已经拥有令牌时),这将失败,因为用户已经删除了应用程序。第二次(成功案例),您正在调用loginWithRead,这被视为一个全新的auth请求,该请求已成功。很抱歉延迟回复:我想自定义此消息。您不能自定义该消息,所以,我们不能隐藏它,而使用其他消息?您可以-将应用程序从开发模式切换到生产模式。
public void onError(FacebookException error)
@Override
public void onError(FacebookException error) {
    Timber.e(error, "Error during facebook login");
    AccessToken.setCurrentAccessToken(null);
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"))
}