with tutorial studio picture example custom con android facebook profile

tutorial - login con facebook android studio



Android: obtén foto de perfil de Facebook (27)

verifica el ID de usuario usa esta url

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

No sé por qué, pero siempre obtengo nulo cuando trato de obtener la imagen de perfil del usuario. ¿Debo configurar algunos permisos específicos para obtener acceso?

Debajo está mi método:

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

Me estoy poniendo nulo. No sé la razón por qué? Cualquier ayuda es apreciable.


¡Una solución completa que funcionó para mí!

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


Busco todos los modos para hacer esto en la API 15, solo que este método me funciona con 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);


Con Glide :

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

entonces;

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


Creo que el problema está en el

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

Use https de http


Cuando haces una solicitud como esta:

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

hace un redireccionamiento a otra url ..

Necesita agregar un parámetro adicional en Obtener solicitud

redirect=false

Me gusta esto

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

y obtendrás el Json con la url Real Image.

Me gusta esto :

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

finalmente haga una nueva solicitud para obtener la imagen que encontró en data-> url


Debe llamar a la API de GraphRequest para obtener la URL de la Imagen de perfil actual.

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

¡Espero que ayude!


Descargue el código fuente desde here

Agrega esta dependencia:

compile ''com.facebook.android:facebook-android-sdk:4.0.1''

activity_main.xml

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/iv_image" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_gravity="center_horizontal" android:src="@drawable/profile"/> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Name" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:text="Name" android:textSize="15dp" android:id="@+id/tv_name" android:gravity="center_vertical" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Email" android:gravity="center_vertical" android:textSize="15dp" android:layout_below="@+id/tv_name" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="Email" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_email" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="DOB" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="DOB" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_dob" android:layout_toRightOf="@+id/tv_email" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Location" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="location" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_location" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:background="#6585C8" android:id="@+id/ll_facebook" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="40dp" android:layout_height="50dp"> <ImageView android:layout_width="50dp" android:src="@drawable/facebook" android:id="@+id/iv_facebook" android:layout_height="50dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Login with Facebook" android:textSize="20dp" android:textColor="#FFFFFF" android:textStyle="bold" android:id="@+id/tv_facebook" android:layout_marginLeft="20dp" android:gravity="center" android:layout_gravity="center" /> </LinearLayout> </LinearLayout>

MainActivity.java

package facebooklocation.facebooklocation; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Base64; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.bumptech.glide.Glide; 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.HttpMethod; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import org.json.JSONObject; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class MainActivity extends AppCompatActivity implements View.OnClickListener { CallbackManager callbackManager; ImageView iv_image, iv_facebook; TextView tv_name, tv_email, tv_dob, tv_location, tv_facebook; LinearLayout ll_facebook; String str_facebookname, str_facebookemail, str_facebookid, str_birthday, str_location; boolean boolean_login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); getKeyHash(); listener(); } private void init() { iv_image = (ImageView) findViewById(R.id.iv_image); iv_facebook = (ImageView) findViewById(R.id.iv_facebook); tv_name = (TextView) findViewById(R.id.tv_name); tv_email = (TextView) findViewById(R.id.tv_email); tv_dob = (TextView) findViewById(R.id.tv_dob); tv_location = (TextView) findViewById(R.id.tv_location); tv_facebook = (TextView) findViewById(R.id.tv_facebook); ll_facebook = (LinearLayout) findViewById(R.id.ll_facebook); FacebookSdk.sdkInitialize(this.getApplicationContext()); } private void listener() { tv_facebook.setOnClickListener(this); ll_facebook.setOnClickListener(this); iv_facebook.setOnClickListener(this); } private void facebookLogin() { callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { Log.e("ONSUCCESS", "User ID: " + loginResult.getAccessToken().getUserId() + "/n" + "Auth Token: " + loginResult.getAccessToken().getToken() ); GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { try { boolean_login = true; tv_facebook.setText("Logout from Facebook"); Log.e("object", object.toString()); str_facebookname = object.getString("name"); try { str_facebookemail = object.getString("email"); } catch (Exception e) { str_facebookemail = ""; e.printStackTrace(); } try { str_facebookid = object.getString("id"); } catch (Exception e) { str_facebookid = ""; e.printStackTrace(); } try { str_birthday = object.getString("birthday"); } catch (Exception e) { str_birthday = ""; e.printStackTrace(); } try { JSONObject jsonobject_location = object.getJSONObject("location"); str_location = jsonobject_location.getString("name"); } catch (Exception e) { str_location = ""; e.printStackTrace(); } fn_profilepic(); } catch (Exception e) { } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id, name, email,gender,birthday,location"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { if (AccessToken.getCurrentAccessToken() == null) { return; // already logged out } new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest .Callback() { @Override public void onCompleted(GraphResponse graphResponse) { LoginManager.getInstance().logOut(); LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email")); facebookLogin(); } }).executeAsync(); } @Override public void onError(FacebookException e) { Log.e("ON ERROR", "Login attempt failed."); AccessToken.setCurrentAccessToken(null); LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday")); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); try { callbackManager.onActivityResult(requestCode, resultCode, data); } catch (Exception e) { } } private void getKeyHash() { // Add code to print out the key hash try { PackageInfo info = getPackageManager().getPackageInfo("facebooklocation.facebooklocation", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } } private void fn_profilepic() { 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) { Log.e("Response 2", response + ""); try { String str_facebookimage = (String) response.getJSONObject().getJSONObject("data").get("url"); Log.e("Picture", str_facebookimage); Glide.with(MainActivity.this).load(str_facebookimage).skipMemoryCache(true).into(iv_image); } catch (Exception e) { e.printStackTrace(); } tv_name.setText(str_facebookname); tv_email.setText(str_facebookemail); tv_dob.setText(str_birthday); tv_location.setText(str_location); } } ).executeAsync(); } @Override public void onClick(View view) { if (boolean_login) { boolean_login = false; LoginManager.getInstance().logOut(); tv_location.setText(""); tv_dob.setText(""); tv_email.setText(""); tv_name.setText(""); Glide.with(MainActivity.this).load(R.drawable.profile).into(iv_image); tv_facebook.setText("Login with Facebook"); } else { LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday,user_location")); facebookLogin(); } } @Override protected void onDestroy() { super.onDestroy(); LoginManager.getInstance().logOut(); } }


En mi gráfico, la API no funcionaba debido al signo de interrogación

Si está utilizando 1 cochecito tras cuadro, sería

picture&type=large

para dos params, usaríamos el signo de interrogación

picture?type=large&redirect=false

¡Espero eso ayude!


Esto debería funcionar:

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

Editar:

Según lo sugerido por @dvpublic en los comentarios, el problema de la imagen que no se descarga se soluciona usando "https" a favor de "http".


Esto debería resolverlo. pero asegúrese de acceder a setfollowredirects estáticamente, es decir, 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);

o

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

Espero que esto ayude


La URL parece estar bien.

Entonces el problema es con tu conexión. ¿URL.getContent () realmente devuelve la transmisión? Porque si BitmapFactory obtiene null, también devuelve null.

Prueba esto:

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


La mejor manera de obtener URL de imagen de perfil

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

o

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

Usa Glide para mostrar la imagen

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

No más cadenas codificadas


Lo he hecho de esta manera:

Obtener Bitmap desde la URL de la imagen de Facebook :

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

Función para mapa de bits :

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

Está hecho.


Obtiene nulo porque la llamada a URL.openConnection () (o cualquier otro mecanismo para recuperar la imagen) es asíncrona. Vuelve después de tu línea: return bitmap; . Por lo tanto, el mapa de bits siempre es nulo.

Sugiero usar una devolución de llamada en su lugar.

Esto es lo que hice:

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 consulta de Android le permite obtener la imagen en diferentes formatos (por ejemplo, matriz de bytes, mapa de bits, etc.). Hay otras bibliotecas por ahí, pero la idea es la misma.


Probablemente se ejecuten sus métodos en el uso principal de la secuencia de comandos

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


Siempre recibí una respuesta que indicaba FACEBOOK_NON_JSON_RESULT . Así que mirando hacia atrás en el explorador API de gráficos de Facebook, noté una pequeña casilla con la etiqueta redirigida marcada. Algunos google me mostraron que necesitaba proporcionar un parámetro a mi GraphRequest que no GraphRequest la redirección. Por lo tanto, la solicitud correcta debe ser:

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


Simplemente usa Picasso. Agregue la Biblioteca Picasso y luego use este simple código de línea:

userpicture = (ImageView) row.findViewById(R.id.postuserid); Picasso.with(context) .load("https://graph.facebook.com/" + userID+ "/picture?type=large") .into(userpicture);


Usé este código y obtuve la imagen de perfil,

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


use Facebook ProfilePictureView en lugar de 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"/>

Después de eso, puedes configurar el id de facebook como este en el código

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

funciona ... también puede establecer el tamaño en pequeño / normal / grande / personalizado para ProfilePictureView


NOTA: Desde el 26 de marzo de 2018, todas las soluciones relacionadas con el enlace manual ya no funcionan

Debes seguir la guía oficial aquí

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


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

usa este código .....


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


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

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


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

prueba esto


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


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