Android Facebook Graph API запрашивает основную информацию - PullRequest
4 голосов
/ 01 июля 2011

просто пытается разрешить моему приложению получать доступ к основной информации от аутентифицированного пользователя Facebook, но мой logcat сообщает мне

06-30 16: 37: 27.969: WARN / System.err (1559): com.facebook.android.FacebookError: Для запроса информации о текущем пользователе необходимо использовать маркер активного доступа.

сразу после аутентификации, где запускается код. Может ли кто-нибудь указать мне правильное направление? Я видел очень похожий пост, где кто-то использовал почти идентичный код, и он работал.

Спасибо

Facebook facebook = new Facebook("187212574660004");

TextView nText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nText = (TextView) this.findViewById(R.id.nameText);

    facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"},

            new DialogListener() {
        public void onComplete(Bundle values) {
            setContentView(R.layout.homepage);
        }

        public void onFacebookError(FacebookError error) {}

        public void onError(DialogError e) {}

        public void onCancel() {}
    });

    JSONObject json_data = null;

    try
    {
        JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook
        JSONArray jArray = response.getJSONArray("data");

        json_data = jArray.getJSONObject(0);
        String name = json_data.getString("name");
        Log.i("friend is", name);
        nText.setText(name);

    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (FacebookError e)
    {
        e.printStackTrace();
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    facebook.authorizeCallback(requestCode, resultCode, data);
}

Попробовал метод, описанный ранее Manno23, и получил

06-30 19:27:04.338: ERROR/AndroidRuntime(349): Caused by: java.lang.NullPointerException 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.getFriends(FacebookPage.java:67) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.access$0(FacebookPage.java:55) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage$1.onComplete(FacebookPage.java:41) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.facebook.android.Facebook.authorizeCallback(Facebook.java:383) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.onActivityResult(FacebookPage.java:93) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.Activity.dispatchActivityResult(Activity.java:3907) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.ActivityThread.deliverResults(ActivityThread.java:2492) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): ... 11 more

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

В этом много неправильного, но я думаю, что первое и самое важное, что вы должны понять, - это то, что запрос на авторизацию является асинхронным.

Это означает, что onComplete () будет вызываться в далеком будущем.Ваши запросы на Facebook выполняются «после» определения обратного вызова для onComplete () в коде, но, видя, как это асинхронно, эти вызовы будут происходить в ожидании до возвращения сетевого запроса на вход в Facebook, что означает, что у вас нет токена авторизациикогда вы делаете этот запрос.

* Я должен добавить, что DialogListener - это класс connivence, написанный на facebook для использования в качестве способа обработки обратных вызовов для асинхронных вызовов.

1 голос
/ 01 июля 2011

Оба приведенных выше ответа верны.Вы можете просто поместить кусок кода, который выполняет запрос, в отдельный метод и вызвать этот метод в onComplete (), т.е.

Facebook facebook = new Facebook("XXXXXasdasdajksdad");

TextView nText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nText = (TextView) this.findViewById(R.id.nameText);

    facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"},

            new DialogListener() {
        public void onComplete(Bundle values) {
            getFriends();
            setContentView(R.layout.homepage);
        }

        public void onFacebookError(FacebookError error) {}

        public void onError(DialogError e) {}

        public void onCancel() {}
    });


}

private void getFriends(){

    JSONObject json_data = null;

    try
    {
        JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook
        JSONArray jArray = response.getJSONArray("data");

        json_data = jArray.getJSONObject(0);
        String name = json_data.getString("name");
        Log.i("friend is", name);
        nText.setText(name);

    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (FacebookError e)
    {
        e.printStackTrace();
    }

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    facebook.authorizeCallback(requestCode, resultCode, data);
}
0 голосов
/ 01 июля 2011

Просто позвоните facebook.request("me/friends") изнутри onComplete и позвольте остальной логике следовать из этого.

Таким образом, он будет вызываться только тогда, когда объект Facebook имеет токен доступа, а не при наличииошибка или что-то подобное.Возможно, вы захотите использовать другие обратные вызовы в DialogListener для лучшего потока.Также подумайте о том, чтобы поддерживать этот объект facebook в приложении, если вы планируете делать больше запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...