我正在使用 Facebook android SDK 注册xmpp_login扩展权限,并且在我的应用程序中有一个地方我想确保我的用户仍然拥有授权的权限。
所以我做了以下测试:
1 - 我用 Session.requestNewPublishPermissions请求xmpp_login
2 - activeSession.getPermissions 列表成功xmpp_login
3 - 然后我从我的 facebook 个人资料隐私设置中撤销了权限
4 - 当我请求 activeSession.getPermissions 时,它仍然列出xmpp_login,即使已经清除使用 close() 的语言环境 facebook 会话缓存。
最奇怪的是,当我调用 activeSession.getAccessToken() 时:
https://graph.facebook.com/me/permissions?ACCESS_TOKEN
xmpp_login 没有出现(这是预期的行为)
我可以通过在我的应用程序中调用https://graph.facebook.com/me/permissions?ACCESS_TOKEN来解决这个问题,但是 android SDK 应该以同样的方式工作,不是吗?
-编辑:我最终写了我上面解释的可悲的解决方案;对于那些遇到同样问题的人来说,这里是:
String url = "https://graph.facebook.com/me/permissions?access_token=" + session.getAccessToken();
new AskFacebookIfXmppIsPermittedTask().execute(url);
和异步任务...
private class AskFacebookIfXmppIsPermittedTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
try {
String urlString = urls[0];
URL url = new URL(urlString);
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(in, writer);
return writer.toString();
} catch (IOException e) {
return "Unable to retrieve web page. URL may be invalid.";
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
try {
JSONObject response = new JSONObject(result);
JSONArray data = (JSONArray)response.get("data");
JSONObject permissions = (JSONObject) data.get(0);
Object xmpp = permissions.get("xmpp_login");
findViewById(R.id.importFacebookContactsFrame).setVisibility(View.GONE);
xmppIsIncludedCallback();
} catch (JSONException e) {
if(shouldPromptFacebook) {
List<String> PERMISSIONS = Arrays.asList("xmpp_login");
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(thisActivity, PERMISSIONS);
Session.getActiveSession().requestNewPublishPermissions(newPermissionsRequest);
}
}
}