2

私は 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 は同じように動作するはずですよね?

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

1 に答える 1

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();
于 2014-03-24T12:12:44.433 に答える