it-swarm.com.de

Android - erhalten Sie ein Facebook-Profilbild

Ich weiß nicht warum, aber ich bekomme immer Null, wenn ich versuche, das Profil des Benutzers zu sehen. Muss ich bestimmte Berechtigungen festlegen, um Zugriff zu erhalten?

Unten ist meine Methode:

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

Ich werde null. Ich weiß nicht warum? Jede Hilfe ist spürbar.

47

Das sollte funktionieren:

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

Bearbeiten:

Wie von @dvpublic in den Kommentaren vorgeschlagen, wird das Problem, dass das Bild nicht heruntergeladen wird, durch "https" zugunsten von "http" behoben.

65
Jeffrey Klardie

verwenden Sie die facebook ProfilePictureView anstelle einer 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"/>

Danach können Sie die Facebook-ID im Code so einstellen

ProfilePictureView profilePictureView;

profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);

profilePictureView.setProfileId(userId);

es funktioniert .. Sie können die Größe für ProfilePictureView auf klein/normal/groß/benutzerdefiniert setzen.

52
Nikhil Borad

Verwenden Sie einfach Picasso. Fügen Sie die Picasso-Bibliothek hinzu und verwenden Sie dann diesen einfachen Zeilencode:

userpicture = (ImageView) row.findViewById(R.id.postuserid);

Picasso.with(context)
       .load("https://graph.facebook.com/" + userID+ "/picture?type=large")
       .into(userpicture);
29
Jesmeen Hoque

Sie müssen die GraphRequest-API aufrufen, um die URL des aktuellen Profilbilds abzurufen.

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

Ich hoffe, es hilft!

15
Rajesh

Der beste Weg, um die Profilbild-URL abzurufen

int dimensionPixelSize = getResources().getDimensionPixelSize(com.facebook.R.dimen.com_facebook_profilepictureview_preset_size_large);
Uri profilePictureUri= Profile.getCurrentProfile().getProfilePictureUri(dimensionPixelSize , dimensionPixelSize);

oder

Uri profilePictureUri = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), dimensionPixelSize , dimensionPixelSize );

Verwenden Sie Glide, um Image anzuzeigen

Glide.with(this).load(profilePictureUri)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .into(profilePictureView);

Keine hartcodierte Zeichenfolge mehr 

14

Überprüfen Sie die Benutzer-ID mit dieser URL

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

Ich habe immer eine Antwort mit einem FACEBOOK_NON_JSON_RESULT erhalten. Zurückblickend in Facebooks API-API-Explorer habe ich ein kleines Ankreuzfeld mit der Label-Umleitung markiert. Ein wenig googeln zeigte mir, dass ich meiner GraphRequest einen Parameter zur Verfügung stellen musste, der die Weiterleitung nicht zulässt. Daher muss die korrekte Anfrage sein:

 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

HINWEIS: Ab dem 26. März 2018 funktionieren alle Lösungen, die sich auf die manuelle Verknüpfung beziehen, nicht mehr.

Sie sollten dem offiziellen Leitfaden hier folgen

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

Ich denke problem liegt im 

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

Verwenden Sie https anstelle von http

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

dann 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

Mit Glide :

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

dann;

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

versuche dies

2
anonymous

Das sollte es lösen. Stellen Sie jedoch sicher, dass Sie auf setfollowredirects statisch zugreifen, d. h.

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

oder

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

Hoffe das hilft

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

Wenn Sie eine solche Anfrage machen:

http://graph.facebook.com/103407310026838/picture?type=square&type=large

es macht eine Weiterleitung auf andere URL .. 

Sie müssen einen zusätzlichen Parameter bei Get request hinzufügen

redirect=false

So was 

http://graph.facebook.com/103407310026838/picture?type=square&type=large&redirect=false

und Sie erhalten einen Json mit Real Image-URL.

So was :

{
   "data": {
      "is_silhouette": true,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/s200x200/1379841_10150004552801901_469209496895221757_n.jpg?oh=4234dcdfc832a58b9ef7a31c7896c73c&oe=57DD01F8"
   }
}

stellen Sie schließlich eine neue Anfrage, um das in data-> url gefundene Bild abzurufen

1
Cliff

Ich suche alle Modi, damit dies auf API 15 funktioniert, nur diese Methode funktioniert für mich mit 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;
        }

verwenden Sie diesen Code .....

0

Ich habe diesen Code verwendet und das Profilbild erhalten,

fbUsrPicURL = "http://graph.facebook.com" + File.separator
                    + String.valueOf(fbUID) + File.separator + "picture?type=large";
0
Aerrow

Auf meiner Grafik funktionierte die API wegen des Fragezeichen nicht 

Wenn Sie nach dem Bild einen Kinderwagen benutzen, wäre dies der Fall

picture&type=large

für zwei Params würden wir das Fragezeichen verwenden

picture?type=large&redirect=false

Ich hoffe es hilft!

0
PcTrollGamer

Facebook API Graph Version 3.2

Ich habe diese Implementierung gemacht:

Stellen Sie zunächst sicher, dass Sie diese Berechtigungen in "onStart" oder "onCreate" Hinzugefügt haben (dies vermeidet die NetworkOnMainThreadException).

StrictMode.ThreadPolicy policy = new 
StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

Danach können Sie die nächste Funktion verwenden:

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

Mein Beispiel wurde mit der offiziellen Dokumentation erstellt: https://developers.facebook.com/docs/graph-api/reference/profile-picture-source/?locale=es_LA

Dies ist wahrscheinlich, dass Sie Ihre Methoden im Haupt-Thread Verwenden

if( Android.os.Build.VERSION.SDK_INT > 9 )
{
  try
  {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy( policy );
  }
}
0

Die URL scheint in Ordnung zu sein.

Also ist das Problem mit deiner Verbindung. Gibt URL.getContent () wirklich einen Stream zurück? Wenn BitmapFactory NULL erhält, wird auch NULL zurückgegeben.

Versuche dies:

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

Sie erhalten null, da der Aufruf von URL.openConnection () (oder einem anderen Mechanismus zum Abrufen des Bildes) asynchron ist. Es wird nach Ihrer Zeile zurückgegeben: return bitmap;. Daher ist die Bitmap immer null.

Ich schlage vor, stattdessen einen Rückruf zu verwenden.

Das habe ich gemacht:

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

Mit der Android-Abfrage können Sie das Bild in verschiedenen Formaten (z. B. Byte-Array, Bitmap usw.) abrufen. Es gibt noch andere Bibliotheken, aber die Idee ist die gleiche.

0
ian

Ich habe diesen Weg gemacht:

Bitmap aus Image-URL von Facebook :

String imageUrl = "http://graph.facebook.com/103407310026838/picture?type=large&width=1000&height=1000";

Bitmap bitmap = getFacebookProfilePicture(imageUrl);

Funktion für 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;
 }

Es ist fertig.

0
Hiren Patel

Eine Komplettlösung, die für mich funktioniert hat!

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