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