Получить изображение профиля с помощью Facebook SDK 3.0 для Android

У меня проблема с Facebook SDK 3.0 для Android. Я хочу получить изображение профиля (и моих друзей) без использования виджета ProfilePictureView, поэтому, если я использую Graph Explorer, я вижу, что ответ Json:

{
   "data": {
         "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/372127_1377011138_1538716206_q.jpg", 
         "is_silhouette": false
    }
}

Мне нужен этот путь "url" для загрузки и отображения изображения, но со следующим кодом:

Request.executeGraphPathRequestAsync(Session.getActiveSession(), 
                                     "me/picture", 
                                      new Request.Callback() {
        @Override
        public void onCompleted(Response response) {
            GraphObject go = response.getGraphObject();
            Log.i("APP_NAME", go.toString());           
        }
});

Я получаю следующее:

GraphObject{graphObjectClass=GraphObject, 
    state={"FACEBOOK_NON_JSON_RESULT":"����\u0000\u0010JFIF\u0000\u0001\u0001\u0000\u0000\u0001\u0000\u0001\u0000\u0000��\u0000"}}

Кто-нибудь может мне помочь? Благодаря

Cromir

Ответы

Ответ 1

Более простым способом было бы выполнить запрос GET на graph.facebook.com/USER_ID/picture, поэтому вам не нужно сначала запрашивать URL-адрес изображения, а затем выполнить другой запрос GET для загрузки изображения с данного URL-адреса.

Вместо использования Request.executeGraphPathRequestAsync просто выполните обычный запрос GET к указанному выше URL-адресу, например. http://graph.facebook.com/4/picture.

Ответ 2

You can retreive user information for executeMeRequest in facebook 3.0 sdk.

    public void executeMeRequest(Session session) {

        Bundle bundle = new Bundle();
        bundle.putString("fields", "picture");
        final Request request = new Request(session, "me", bundle,
                HttpMethod.GET, new Request.Callback() {

            @Override
            public void onCompleted(Response response) {
                GraphObject graphObject = response.getGraphObject();
                if(graphObject != null) {
                    try {
                        JSONObject jsonObject = graphObject.getInnerJSONObject();
                        JSONObject obj = jsonObject.getJSONObject("picture").getJSONObject("data");
                        final String url = obj.getString("url");
                            new Thread(new Runnable() {

                                @Override
                                public void run() {

                                    final Bitmap bitmap = BitmapFactory.decodeStream(HttpRequest(url);
                                    runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            imageView.setImageBitmap(bitmap);
                                        }
                                    });
                                }
                            }).start();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Request.executeBatchAsync(request);
    }

public static InputStream HttpRequest(String strUrl) {

    HttpResponse responce = null;
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet();
        request.setURI(new URI(strUrl));
        responce = httpClient.execute(request);
        HttpEntity entity = responce.getEntity();
        return entity.getContent();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    return null;
}

Ответ 3

Вы можете получить изображение профиля, запросив API-интерфейс Graph. Вам нужно пройти accessToken, идентификатор пользователя, а также установить перенаправление false. Затем Graph API возвращает JSON, а из JSON вы можете получить поле url, которое является профилем пользователя.

  GraphRequest request = new GraphRequest(accessToken, "/" + userID + "/picture",null,HttpMethod.GET, new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {
                    Log.d("Photo Profile", response.getJSONObject().toString());
                    JSONObject jsonObject = response.getJSONObject();
                    try {

                        JSONObject data = jsonObject.getJSONObject("data");
                        String url = data.getString("url");
                        Picasso.with(getApplicationContext()).load(url).into(ivProfilePicture);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
            Bundle parameters =new Bundle();
            parameters.putString("type","large");
            parameters.putBoolean("redirect",false);
            request.setParameters(parameters);
            request.executeAsync();

Ответ 4

Вероятно, вам нужно включить "Picture As Dictionary" в расширенных настройках вашего приложения в консоли разработчика в https://developers.facebook.com/apps

Ответ 5

Насколько мне известно, невозможно получить изображение напрямую, используя API-интерфейс facebook, потому что их API предназначен только для принятия ответов JSON. Кажется странным, что они разрешат запрос, который приведет к ответу, не относящемуся к JSON, и особенно странно, что они поместили бы этот запрос в свою официальную документацию * (https://developers.facebook.com/docs/graph-api/reference/user/picture/).

Я использую встроенную библиотеку Android DefaultHttpClient.

private Bitmap downloadImage(url) {
    Bitmap image = null;
    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(imageUrl);
    try {
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();

        int imageLength = (int)(entity.getContentLength());

        InputStream is = entity.getContent();

        byte[] imageBlob = new byte[imageLength];

        int bytesRead = 0;

        // Pull the image byte array

        while (bytesRead < imageLength) {
            int n = is.read(imageBlob, bytesRead, imageLength - bytesRead);
            bytesRead= n;
        }

        image = BitmapFactory.decodeByteArray(imageBlob, 0, imageBlob.length);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return image;
}

Ответ 6

Я получил ответ... это из-за перенаправления. поэтому передайте params вместо null:

Bundle params = new Bundle();
params.putBoolean("redirect", false);