Android Session.getPermissions即使在被撤销时也会列出xmpp\U登录名

Android Session.getPermissions即使在被撤销时也会列出xmpp\U登录名,android,facebook,facebook-graph-api,Android,Facebook,Facebook Graph Api,我正在使用Facebook android SDK注册xmpp_登录扩展权限,在我的应用程序中有一个地方,我想确保我的用户仍然拥有授权权限 所以我做了以下测试: 1-我要求xmpp_登录会话。requestNewPublishPermissions 2-activeSession.getPermissions列表成功xmpp_登录 3-然后我从我的facebook个人资料隐私设置中撤销了权限 4-当我请求activeSession.getPermissions时,它仍然会列出xmpp_登录名,即

我正在使用Facebook android SDK注册xmpp_登录扩展权限,在我的应用程序中有一个地方,我想确保我的用户仍然拥有授权权限

所以我做了以下测试:

1-我要求xmpp_登录会话。requestNewPublishPermissions
2-activeSession.getPermissions列表成功xmpp_登录
3-然后我从我的facebook个人资料隐私设置中撤销了权限
4-当我请求activeSession.getPermissions时,它仍然会列出xmpp_登录名,即使使用close()清除了区域设置facebook会话缓存

最有趣的是,使用activeSession.getAccessToken()调用时:

xmpp_登录未显示(这是预期行为)

我可以通过调用我的应用程序来解决这个问题,但是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);
            }
        }
   }
私有类AskFacebookIfXmppIsPermittedTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
试一试{
字符串urlString=url[0];
URL=新URL(URL字符串);
URLConnection URLConnection=url.openConnection();
InputStream in=urlConnection.getInputStream();
StringWriter编写器=新的StringWriter();
副本(在,作者);
返回writer.toString();
}捕获(IOE异常){
return“无法检索网页。URL可能无效。”;
}
}
//onPostExecute显示异步任务的结果。
@凌驾
受保护的void onPostExecute(字符串结果){
试一试{
JSONObject响应=新JSONObject(结果);
JSONArray数据=(JSONArray)response.get(“数据”);
JSONObject权限=(JSONObject)数据。获取(0);
对象xmpp=permissions.get(“xmpp_login”);
findViewById(R.id.importFacebookContactsFrame).setVisibility(View.GONE);
xmppIsIncludedCallback();
}捕获(JSONException e){
如果(应该提示Facebook){
列表权限=Arrays.asList(“xmpp_登录”);
Session.newpermissions请求newpermissions请求=新建会话.newpermissions请求(此活动,权限);
Session.getActiveSession().requestNewPublishPermissions(newPermissionsRequest);
}
}
}

我认为你的方法还可以。我不明白为什么facebook提供了这样一个容易出错的功能。也许我也遗漏了一些东西

我的解决方案与你的基本相同,但我使用了facebook请求类。我想我会分享它,以防万一

    new com.facebook.Request(session, "/me/permissions", null, HttpMethod.GET, new com.facebook.Request.Callback()
    {
        @Override
        public void onCompleted(Response response)
        {
            GraphObject go = response.getGraphObject();
            JSONObject jo = go.getInnerJSONObject();
            try
            {
                JSONArray ja = (JSONArray) jo.get("data");
                JSONObject perm = ja.getJSONObject(0);
                boolean publish_actions = perm.has("publish_actions");
                if (publish_actions)
                {
                    //you can share 
                }
                else
                {
                Log.i("Test", "Session has no permission");
                Session.getActiveSession().requestNewPublishPermissions(
                                new NewPermissionsRequest(Activity.this, Arrays.asList("publish_actions")));

                }
            }
            catch (JSONException e)
            {
                e.printStackTrace();
            }
        }
    }).executeAsync();