web-dev-qa-db-fra.com

Android - obtenir une photo de profil facebook

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.

47

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);

Modifier:

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".

65
Jeffrey Klardie

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

52
Nikhil Borad

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);
29
Jesmeen Hoque

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!

15
Rajesh

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 

14

vérifier l'ID utilisateur utiliser cette URL

imgurl="https://graph.facebook.com/"+user.getId()+"/picture";
4
Amit kumar

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();                                      
4
Ravi Vaghela

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;
    }
4
thanhbinh84

Je pense que le problème est dans le 

imageURL = "**http**://graph.facebook.com/"+userID+"/picture?type=large";

Utilisez https au lieu de http

2
Arpit Patel
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";

alors Picasso.with(getApplicationContext()).load(imgUrl).into(imageView);

2
Misho Zhghenti
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();
2
Rohan Mistry
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();
2
Monir Khlaf

Avec Glide :

userId = loginResult.getAccessToken().getUserId();

puis;

Glide.with(this)
        .load("https://graph.facebook.com/" + userId+ "/picture?type=large")
        .into(imgProfile);
2
Ege Kuzubasioglu
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";

essaye ça

2
anonymous

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

1
Uche Dim
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);
    }
}
1
Tigran Sarkisian

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

1
Cliff

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);
0
jamaglian
   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 .....

0
Bhavishya Prajapati

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";
0
Aerrow

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!

0
PcTrollGamer

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

0

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 );
  }
}
0
Taras Matolinets

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();
}
0
Audrius K

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.

0
ian

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.

0
Hiren Patel

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);
    }

}
0
Rohit Mandiwal