it-swarm.com.ru

Получить изображение профиля с помощью 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

15
Giulio Bider

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

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

10
Jesse Chen
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;
}
9
Muhammad Aamir Ali

Вы можете получить изображение профиля, обратившись к Graph API. Вам необходимо передать 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();
2
Nick Zisis

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

Я использую встроенную библиотеку 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's 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;
}
1
Cypress Frankenfeld

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

1
Ryan Speets

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

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