#android #facebook #facebook-graph-api
#Android #Facebook #facebook-graph-api
Вопрос:
Я хочу показать изображение профиля пользователя в виде списка. Когда я пытаюсь вызвать graph-api с Android для извлечения изображения, я всегда получаю следующую ошибку.
java.io.IOException: Hostname <fbcdn-profile-a.akamaihd.net> was not verified
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.getSecureSocket(HttpConnection.java:170)
at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnection$HttpsEngine.connect(HttpsURLConnection.java:398)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.sendRequest(HttpURLConnection.java:1224)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.doRequestInternal(HttpURLConnection.java:1558)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.doRequest(HttpURLConnection.java:1551)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1052)
at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnection.getInputStream(HttpsURLConnection.java:252)
at com.facebook.android.Util.openUrl(Util.java:200)
at com.facebook.android.Facebook.request(Facebook.java:559)
Это код, используемый мной:
private static void retrieveProfilePicture(String userId) throws MalformedURLException, IOException{
facebook = FacebookHelper.getInstance();
Bundle bundle = new Bundle();
bundle.putString(Facebook.TOKEN, facebook.getAccessToken());
Object picture = facebook.request("/" userId "/picture", bundle, "GET");
Когда я выполняю тот же вызов в браузере (https://graph.facebook.com//picture ?access_token =), затем я получаю изображение, возвращаемое по URL, подобному этому
https://fbcdn-profile-a.akamaihd.net/...
В каком формате мне доставлено изображение? JSON с ссылкой на изображение (URL)?
Ответ №1:
ImageView user_picture;
userpicture=(ImageView)findViewById(R.id.userpicture);
URL img_value = null;
img_value = new URL("http://graph.facebook.com/" id "/picture?type=large");
Bitmap mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
userpicture.setImageBitmap(mIcon1);
Где ID — это один из идентификаторов вашего профиля.
Для получения дополнительной информации ознакомьтесь с этой ссылкой на Graph API
……………………….
Комментарии:
1. @FelipeConde Для этого вам не нужен никакой токен доступа. Вы можете использовать этот URL в любом браузере и убедиться, что он работает для любого идентификатора профиля
2. @IncrediApp Вы правы. Вам просто нужен токен при использовании «me» вместо идентификатора пользователя.
3. @Venky Я получаю следующую ошибку: «Исключение android.os.NetworkOnMainThreadException». Вы поместили этот код в AsyncTask? Спасибо
4. да, этот код заблокирует основной поток до завершения загрузки. Действительно плохо, особенно если вы произносите 30 таких запросов одновременно
Ответ №2:
Я знаю, что этот вопрос довольно старый, но в настоящее время есть другой способ легко получить изображение пользователя.
Во-первых, в макете xml используйте:
<com.facebook.widget.ProfilePictureView
android:id="@ id/userImage"
android:layout_width="69dp"
android:layout_height="69dp"
android:layout_gravity="center_horizontal" />
Затем в вашем фрагменте или activity, в методе onSessionStateChange:
private void onSessionStateChange(Session session, SessionState state,
Exception exception) {
if (state.isOpened()) {
Log.i(TAG, "Logged in...");
// Request user data and show the results
Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
//HERE: DISPLAY USER'S PICTURE
userPicture.setProfileId(user.getId());
}
}
}).executeAsync();
} else if (state.isClosed()) {
Log.i(TAG, "Logged out...");
userPicture.setProfileId(null);
}
}
Надеюсь, это может кому-то помочь. Я столкнулся с той же проблемой, и я получаю этот пост, но это 2011 год. Сегодня (2013) способ ведения дел изменился.
Ответ №3:
Вы можете это сделать, используя ProfilePictureView вместо просмотра изображения:
<com.facebook.widget.ProfilePictureView
android:id="@ id/friendProfilePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="5sp"
facebook:preset_size="small" />
Вы можете установить размер на маленький / обычный / большой / пользовательский.
Затем в вашем коде задайте идентификатор facebook пользователя следующим образом:
ProfilePictureView profilePictureView;
profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);
profilePictureView.setProfileId(userId);
Надеюсь, это поможет.
Комментарии:
1. На сегодняшний день это самое простое решение, но я думаю, что пакет переместился на com.facebook. вход в систему.виджет. ProfilePictureView
Ответ №4:
Существует простой способ получить изображение пользователя Facebook для вошедшего в систему пользователя.
Чтобы заставить код работать, добавьте этот оператор импорта:
import com.facebook.Profile;
Смотрите пример ниже (в этом примере я использую библиотеку Picasso для установки изображения):
Uri imageUri = Profile.getCurrentProfile().getProfilePictureUri(400, 400);
Picasso.with(this).load(imageUri).into(imageView);
Числа 400 и 400 — это ширина и высота изображения соответственно.
Ответ №5:
Может быть написано другим способом:
ImageView user_picture;
ImageView userpicture = (ImageView)findViewById(R.id.userpicture);
URL img_value = null;
try {
img_value = new URL("http://graph.facebook.com/" "100004545962286" "/picture?type=large");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Bitmap mIcon1 = null;
try {
mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
userpicture.setImageBitmap(mIcon1);
Комментарии:
1. Кажется, что URL имеет перенаправление, и изображение будет нулевым.
Ответ №6:
Используйте приведенный ниже код, чтобы получить изображение профиля пользователя с помощью Facebook Graph API
.
ImageView profileImage = (ImageView) findViewById(R.id.profileImage);
Bundle params = new Bundle();
params.putBoolean("redirect", false);
params.putString("type", "large");
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"me/picture",
params,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
try {
String picUrlString = (String) response.getJSONObject().getJSONObject("data").get("url");
Glide.with(getApplicationContext()).load(picUrlString).placeholder(R.drawable.ic_launcher).into(profileImage);
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
).executeAsync();
И более подробную информацию смотрите в этом
или
Получить изображение пользователя просто
String UserImageUrl="https://graph.facebook.com/" facebookUser.getFacebookID() "/picture?type=large";
Glide.with(getApplicationContext()).load(UserImageUrl).placeholder(R.drawable.ic_launcher).into(profileImage);
Комментарии:
1. является ли это лучшим подходом для получения изображения пользователя быстрее, чем использование httpclient или webclient для его загрузки? какой способ лучше и быстрее?
Ответ №7:
private String facebookUser;
AccessToken token;
token = AccessToken.getCurrentAccessToken();
facebookUser = AccessToken.getCurrentAccessToken().getUserId();
ProfilePictureView profilePictureView;
profilePictureView = (ProfilePictureView) findViewById(R.id.facebookUser);
ProfilePictureView.setProfileId(facebookUser);
xml
<com.facebook.login.widget.ProfilePictureView
android:id="@ id/facebookUser"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"></com.facebook.login.widget.ProfilePictureView>
надеюсь, это поможет!