2013-09-24 10 views
2

我使用Facebook Android SDK註冊 xmpp_login擴展權限,並且在我的應用程序中有一個位置,我想確保我的用戶仍具有授權。Session.getPermissions會一直列出xmpp_login,即使被撤銷時

所以我做了如下試驗:

1 - 我問 xmpp_login與Session.requestNewPublishPermissions
2 - activeSession.getPermissions成功列表 xmpp_login
3 - 然後,我從吊銷我的權限facebook配置文件隱私設置
4 - 當我詢問activeSession.getPermissions時,它仍然列出了 xmpp_login,即使在用close()清除語言環境facebook會話緩存之後。

的wierdest的是,與activeSession.getAccessToken(),當我打電話:
https://graph.facebook.com/me/permissions?ACCESS_TOKEN
xmpp_login一點兒也不顯示出來(這是預期的行爲)

我可以解決,通過在我的應用程序中調用https://graph.facebook.com/me/permissions?ACCESS_TOKEN,但android SDK應該以相同的方式工作,不應該嗎?

-EDIT: 我最終寫了上面解釋過的悲傷解決方案;這裏是,對於那些誰遇到了同樣的問題:

String url = "https://graph.facebook.com/me/permissions?access_token=" + session.getAccessToken(); 
new AskFacebookIfXmppIsPermittedTask().execute(url); 

和的AsyncTask ...

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); 
      } 
     } 
    } 

回答

0

我覺得你的做法是好的。我沒有得到的是爲什麼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();