Использовать идентификатор приложения Facebook для ProfilePictureView

Я реализую SDK facebook для приложения для Android. У меня есть ProfilePictureView, который требует заполнения:

profilePictureView.setProfileId(id)

Вчера, если я использовал идентификатор профиля в области приложения (тот, который был возвращен Graph API), это сработало: это единственный идентификатор, который у меня есть, потому что, очевидно, это противоречит политике Facebook, чтобы получить «настоящий» идентификатор.

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

1
1
1 786
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С 26 марта 2018 года все решения, связанные с ручной ссылкой, больше не работают

Используйте код ниже

private static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
    private static String FACEBOOK_FIELDS = "fields";

    private void getFacebookData() {
        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                (object, response) -> {
                    updateAvatar(getImageUrl(response));
                });
        Bundle parameters = new Bundle();
        parameters.putString(FACEBOOK_FIELDS, FACEBOOK_FIELD_PROFILE_IMAGE);
        request.setParameters(parameters);
        request.executeAsync();
    }

    private static String FACEBOOK_FIELD_PICTURE = "picture";
    private static String FACEBOOK_FIELD_DATA = "data";
    private static String FACEBOOK_FIELD_URL = "url";
    private String getImageUrl(GraphResponse response) {
        String url = null;
        try {
            url = response.getJSONObject()
                    .getJSONObject(FACEBOOK_FIELD_PICTURE)
                    .getJSONObject(FACEBOOK_FIELD_DATA)
                    .getString(FACEBOOK_FIELD_URL);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

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

Simone Chelo 27.03.2018 22:12

Я только сейчас замечаю, что это решение отлично подходит для изображения профиля пользователя, но как насчет изображения профиля другого пользователя, зная его идентификатор?

Simone Chelo 27.03.2018 22:37

Я отвечу сам, так как этот вопрос конкретно требует «получить изображение профиля с учетом идентификатора», а поучительный ответ Левона работает только для текущего пользователя.

private static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
private static String FACEBOOK_FIELDS = "fields";
private static String FACEBOOK_FIELD_PICTURE = "picture";
private static String FACEBOOK_FIELD_DATA = "data";
private static String FACEBOOK_FIELD_URL = "url";

public static void getFacebookProfileUrl(String id, final Response<String> response) {
    GraphRequest request = GraphRequest.newGraphPathRequest(
            AccessToken.getCurrentAccessToken(),
            "/" + id,
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse graph) {
                    String imgUrl = getImageUrl(graph);
                    // imgUrl is the url of the profilepic of the user with given id. 
                    // Works both for "real" id and "app-scoped" id
                }
            });

    Bundle parameters = new Bundle();
    parameters.putString(FACEBOOK_FIELDS, FACEBOOK_FIELD_PROFILE_IMAGE);
    request.setParameters(parameters);
    request.executeAsync();
}


private static String getImageUrl(GraphResponse response) {
    String url = null;
    try {
        url = response.getJSONObject()
                .getJSONObject(FACEBOOK_FIELD_PICTURE)
                .getJSONObject(FACEBOOK_FIELD_DATA)
                .getString(FACEBOOK_FIELD_URL);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return url;
}

Другие вопросы по теме