Je ne sais pas pourquoi, mais je deviens toujours nul lorsque j'essaie d'obtenir l'image de profil de l'utilisateur. Dois-je définir des autorisations spécifiques pour accéder?
Voici ma méthode:
public static Bitmap getFacebookProfilePicture(String userID) throws SocketException, SocketTimeoutException, MalformedURLException, IOException, Exception
{
String imageURL;
Bitmap bitmap = null;
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=large";
InputStream in = (InputStream) new URL(imageURL).getContent();
bitmap = BitmapFactory.decodeStream(in);
return bitmap;
}
Bitmap bitmap = getFacebookProfilePicture(userId);
Je deviens nul. Je ne sais pas pourquoi Toute aide est appréciable.
Cela devrait fonctionner:
public static Bitmap getFacebookProfilePicture(String userID){
URL imageURL = new URL("https://graph.facebook.com/" + userID + "/picture?type=large");
Bitmap bitmap = BitmapFactory.decodeStream(imageURL.openConnection().getInputStream());
return bitmap;
}
Bitmap bitmap = getFacebookProfilePicture(userId);
Comme suggéré par @dvpublic dans les commentaires, le problème d'image non téléchargée est résolu en utilisant "https" en faveur de "http".
utiliser le ProfilePictureView facebook au lieu d'une ImageView
<com.facebook.login.widget.ProfilePictureView
Android:id="@+id/friendProfilePicture"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true"
facebook:preset_size="small"/>
Après cela, vous pouvez définir l'identifiant facebook comme ceci dans le code
ProfilePictureView profilePictureView;
profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);
profilePictureView.setProfileId(userId);
cela fonctionne ... vous pouvez également définir la taille sur small/normal/large/custom pour ProfilePictureView
Utilisez simplement Picasso. Ajoutez la bibliothèque Picasso, puis utilisez ce code de ligne simple:
userpicture = (ImageView) row.findViewById(R.id.postuserid);
Picasso.with(context)
.load("https://graph.facebook.com/" + userID+ "/picture?type=large")
.into(userpicture);
Vous devez appeler l'API GraphRequest pour obtenir l'URL de l'image de profil actuelle.
Bundle params = new Bundle();
params.putString("fields", "id,email,picture.type(large)");
new GraphRequest(AccessToken.getCurrentAccessToken(), "me", params, HttpMethod.GET,
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
if (response != null) {
try {
JSONObject data = response.getJSONObject();
if (data.has("picture")) {
String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
Bitmap profilePic = BitmapFactory.decodeStream(profilePicUrl.openConnection().getInputStream());
// set profilePic bitmap to imageview
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).executeAsync();
J'espère que ça aide!
Meilleur moyen d'obtenir l'URL de l'image de profil
int dimensionPixelSize = getResources().getDimensionPixelSize(com.facebook.R.dimen.com_facebook_profilepictureview_preset_size_large);
Uri profilePictureUri= Profile.getCurrentProfile().getProfilePictureUri(dimensionPixelSize , dimensionPixelSize);
ou
Uri profilePictureUri = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), dimensionPixelSize , dimensionPixelSize );
Utilisez Glide pour afficher l'image
Glide.with(this).load(profilePictureUri)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(profilePictureView);
Plus de chaîne codée en dur
vérifier l'ID utilisateur utiliser cette URL
imgurl="https://graph.facebook.com/"+user.getId()+"/picture";
J'ai toujours reçu une réponse indiquant un FACEBOOK_NON_JSON_RESULT
. Donc, en regardant dans l’API graphique de Facebook, j’ai noté une petite case à cocher avec la redirection d’étiquette cochée. Certaines recherches sur Google m'ont montré que je devais fournir un paramètre à ma GraphRequest
qui interdit la redirection. Par conséquent, la demande correcte doit être:
Bundle params = new Bundle();
params.putBoolean("redirect", false);
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");
//Load picture url in imageView
Glide.with(this).load(picUrlString).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(profilePictureView);
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
).executeAsync();
NOTE: à partir du 26 mars 2018, toutes les solutions liées à la liaison manuelle ne fonctionnent plus
Vous devriez suivre le guide officiel ici _
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;
}
Je pense que le problème est dans le
imageURL = "**http**://graph.facebook.com/"+userID+"/picture?type=large";
Utilisez https
au lieu de http
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";
alors Picasso.with(getApplicationContext()).load(imgUrl).into(imageView);
Bundle bundle = new Bundle();
bundle.putString ("fields", "full_picture,message");
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"{page-id}/feed",
bundle,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
Log.e("TAG", response.toString());
}
}
).executeAsync();
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
try {
String imageURL = "https://graph.facebook.com/" + mFbUserId +"/picture?width=150&width=150";
URL imageURI = new URL(imageURL);
bitmap = BitmapFactory.decodeStream(imageURI.openConnection().getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}.execute();
Avec Glide :
userId = loginResult.getAccessToken().getUserId();
puis;
Glide.with(this)
.load("https://graph.facebook.com/" + userId+ "/picture?type=large")
.into(imgProfile);
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";
essaye ça
Cela devrait le résoudre. mais veillez à accéder à setfollowredirect de manière statique, à savoir HttpURLConnection.setFollowRedirects (HttpURLConnection.getFollowRedirects ());
url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 300, 300);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
myBitmap= BitmapFactory.decodeStream(input, null, options);
ou
url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
myBitmap= BitmapFactory.decodeStream(input);
J'espère que cela t'aides
private void importFbProfilePhoto() {
if (AccessToken.getCurrentAccessToken() != null) {
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject me, GraphResponse response) {
if (AccessToken.getCurrentAccessToken() != null) {
if (me != null) {
String profileImageUrl = ImageRequest.getProfilePictureUri(me.optString("id"), 500, 500).toString();
Log.i(LOG_TAG, profileImageUrl);
}
}
}
});
GraphRequest.executeBatchAsync(request);
}
}
Lorsque vous faites une demande comme celle-ci:
http://graph.facebook.com/103407310026838/picture?type=square&type=large
il fait une redirection vers une autre url ..
Vous devez ajouter un paramètre supplémentaire sur Obtenir une demande.
redirect=false
Comme ça
http://graph.facebook.com/103407310026838/picture?type=square&type=large&redirect=false
et vous obtiendrez un Json avec une image Real Image ..
Comme ça :
{
"data": {
"is_silhouette": true,
"url": "https://scontent.xx.fbcdn.net/v/t1.0-1/s200x200/1379841_10150004552801901_469209496895221757_n.jpg?oh=4234dcdfc832a58b9ef7a31c7896c73c&oe=57DD01F8"
}
}
enfin faire une nouvelle demande pour obtenir l'image que vous avez trouvée dans data-> url
Je recherche tous les modes pour que cela soit sur API 15, mais cette méthode fonctionne pour moi avec Volley
String url = "https://graph.facebook.com/"+ fid +"/picture?type=square";
ImageRequest request = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
});
AppController.getInstance().addToRequestQueue(request);
public static Bitmap getFacebookProfilePicture(String userID)
throws SocketException, SocketTimeoutException,
MalformedURLException, IOException, Exception {
String imageURL;
Bitmap bitmap = null;
imageURL = "http://graph.facebook.com/" + userID
+ "/picture?type=large";
URL url1 = new URL(imageURL);
HttpURLConnection ucon1 = (HttpURLConnection) url1.openConnection();
ucon1.setInstanceFollowRedirects(false);
URL secondURL1 = new URL(ucon1.getHeaderField("Location"));
InputStream in = (InputStream) new URL(imageURL).getContent();
bitmap = BitmapFactory.decodeStream(in);
return bitmap;
}
utiliser ce code .....
J'ai utilisé ce code et j'ai eu la photo de profil,
fbUsrPicURL = "http://graph.facebook.com" + File.separator
+ String.valueOf(fbUID) + File.separator + "picture?type=large";
Sur mon graphique, l'API ne fonctionnait pas à cause du point d'interrogation
Si vous utilisez 1 poussette après la photo, ce serait
picture&type=large
pour deux paramètres, nous utiliserions le point d'interrogation
picture?type=large&redirect=false
J'espère que ça aide!
Facebook API Graph Version 3.2
J'ai fait cette implémentation:
Assurez-vous d'abord que ces autorisations sont ajoutées dans "onStart" ou "onCreate" (Cela évite l'exception NetworkOnMainThreadException).
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Après cela, vous pouvez utiliser la fonction suivante:
//Next lines are Strings used as params
public static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
public static String FACEBOOK_FIELDS = "fields";
//A function that can be accessed from OnCreate (Or a similar function)
private void setImageProfileFacebook(){
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
if(isLoggedIn) {
//If the user is LoggedIn then continue
Bundle parameters = new Bundle();
parameters.putString(Util.FACEBOOK_FIELDS, Util.FACEBOOK_FIELD_PROFILE_IMAGE);
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"me",
parameters,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
if (response != null) {
try {
JSONObject data = response.getJSONObject();
//Log.w(TAG, "Data: " + response.toString());
if (data.has("picture")) {
boolean is_silhouette = data.getJSONObject("picture").getJSONObject("data").getBoolean("is_silhouette");
if (!is_silhouette) {
//Silhouette is used when the FB user has no upload any profile image
URL profilePicUrl = new URL(data.getJSONObject("picture").getJSONObject("data").getString("url"));
InputStream in = (InputStream) profilePicUrl.getContent();
Bitmap bitmap = BitmapFactory.decodeStream(in);
imageViewProfileFisio.setImageBitmap(bitmap);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
Log.w(TAG, "Response null");
}
}
}
).executeAsync();
}
}
Mon exemple a été créé à l'aide de la documentation officielle: https://developers.facebook.com/docs/graph-api/reference/profile-picture-source/?locale=es_LA
C’est probablement que vous exécutez vos méthodes dans le fil principal Use
if( Android.os.Build.VERSION.SDK_INT > 9 )
{
try
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy( policy );
}
}
Url semble OK.
Donc, le problème est avec votre connexion. URL.getContent () renvoie-t-il vraiment le flux? Parce que si BitmapFactory obtient null, il renvoie également null.
Essaye ça:
Bitmap bitmap = null;
URL url = new URL(http://graph.facebook.com/"+userID+"/picture?type=large);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
bitmap = BitmapFactory.decodeStream(in);
}
finally {
urlConnection.disconnect();
}
Vous obtenez null car l'appel à URL.openConnection () (ou tout autre mécanisme permettant d'extraire l'image) est asynchrone. Il retourne après votre ligne: return bitmap;
. Par conséquent, bitmap est toujours nul.
Je suggère d'utiliser un rappel à la place.
C'est ce que j'ai fait:
final AQuery androidQuery = new AQuery(this);
AjaxCallback<byte[]> imageCallback = new AjaxCallback<byte[]>() {
@Override
public void callback(String url, byte[] avatar, AjaxStatus status) {
if (avatar != null) {
save(avatar);
} else {
Log.e(TAG, "Cannot fetch third party image. AjaxStatus: " + status.getError());
}
}
};
androidQuery.ajax(imageUrl, byte[].class, imageCallback);
La requête Android vous permet d’obtenir l’image dans différents formats (tableau d’octets, Bitmap, etc.). Il y a d'autres bibliothèques sur le marché, mais l'idée est la même.
J'ai fait comme ça:
Obtenir Bitmap à partir de URL de l'image de Facebook:
String imageUrl = "http://graph.facebook.com/103407310026838/picture?type=large&width=1000&height=1000";
Bitmap bitmap = getFacebookProfilePicture(imageUrl);
Fonction pour Bitmap:
private Bitmap getFacebookProfilePicture(String url){
Bitmap bitmap = null;
HttpGet httpRequest = new HttpGet(URI.create(url));
HttpClient httpclient = new DefaultHttpClient();
HttpResponse mResponse;
try {
mResponse = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = mResponse.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
bitmap = BitmapFactory.decodeStream(bufHttpEntity.getContent());
httpRequest.abort();
}
catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
C'est fait.
Une solution complète qui a fonctionné pour moi!
import Android.app.Dialog;
import Android.content.Intent;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.text.Html;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.login.widget.ProfilePictureView;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
CallbackManager callbackManager;
Button share,details;
ShareDialog shareDialog;
LoginButton login;
ProfilePictureView profile;
Dialog details_dialog;
TextView details_txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
callbackManager = CallbackManager.Factory.create();
login = (LoginButton)findViewById(R.id.login_button);
profile = (ProfilePictureView)findViewById(R.id.picture);
shareDialog = new ShareDialog(this);
share = (Button)findViewById(R.id.share);
details = (Button)findViewById(R.id.details);
login.setReadPermissions("public_profile email");
share.setVisibility(View.INVISIBLE);
details.setVisibility(View.INVISIBLE);
details_dialog = new Dialog(this);
details_dialog.setContentView(R.layout.dialog_details);
details_dialog.setTitle("Details");
details_txt = (TextView)details_dialog.findViewById(R.id.details);
details.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
details_dialog.show();
}
});
if(AccessToken.getCurrentAccessToken() != null){
RequestData();
share.setVisibility(View.VISIBLE);
details.setVisibility(View.VISIBLE);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(AccessToken.getCurrentAccessToken() != null) {
share.setVisibility(View.INVISIBLE);
details.setVisibility(View.INVISIBLE);
profile.setProfileId(null);
}
}
});
share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ShareLinkContent content = new ShareLinkContent.Builder().build();
shareDialog.show(content);
}
});
login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
if(AccessToken.getCurrentAccessToken() != null){
RequestData();
share.setVisibility(View.VISIBLE);
details.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}
public void RequestData(){
GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object,GraphResponse response) {
JSONObject json = response.getJSONObject();
try {
if(json != null){
String text = "<b>Name :</b> "+json.getString("name")+"<br><br><b>Email :</b> "+json.getString("email")+"<br><br><b>Profile link :</b> "+json.getString("link");
details_txt.setText(Html.fromHtml(text));
profile.setProfileId(json.getString("id"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,email,picture");
request.setParameters(parameters);
request.executeAsync();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}