Obtener lista de amigos facebook 3.0
Estoy tratando de obtener mi lista de amigos de facebook usando nuevo SDK (3.0). Estoy enfrentando problemas relacionados con qué tipo de parámetros debo insertar en un Bundle y cómo usar newMyFriendRequest y GraphAPI.
No encontré en la documentación de facebook un lugar sobre qué tipo de campo tenemos que usar. Basándome en GraphExplorer , inserto en mi paquete la clave "fields" con esta cadena "id, name, friend" como valor. El siguiente código muestra lo que estoy haciendo ahora mismo. Después de obtener Mi imagen y nombre, ejecuto newMyFriendRequest. Creo que utiliza GraphAPI por defecto.
- Solicitudes de juego en Facebook: Objeto que no pertenece a la aplicación
- Publicar en los amigos del usuario la pared de facebook a través de la aplicación Android
- Android: ¿Cuál es la clase de diálogo compartido en Facebook SDK 4.x
- Cómo utilizar el Facebook Graph Api Cursor basado en la paginación
- Combinando la API de Google Places y la API de sitios de Facebook
He visto aquí en StackOverflow algunos posts relacionados:
Cómo enviar una consulta FQL con el nuevo SDK de Android
Facebook Android SDK parámetros de la solicitud: ¿dónde encontrar la documentación?
Me ayuda poco y no quiero usar FQL. Para la respuesta estoy recibiendo este JSON como una respuesta:
{Response: responseCode: 500, graphObject: null, error: {HttpStatus: 500, errorCode: 100, errorType: FacebookApiException, errorMessage: Unsupported operation}, isFromCache:false}
Tenga en cuenta que soy muy nuevo en Facebook SDK para Android.
private void onSessionStateChange(final Session session, SessionState sessionState, Exception ex){ if(session != null && session.isOpened()){ getUserData(session); } } private void getUserData(final Session session){ Request request = Request.newMeRequest(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if(user != null && session == Session.getActiveSession()){ pictureView.setProfileId(user.getId()); userName.setText(user.getName()); getFriends(); } if(response.getError() !=null){ } } }); request.executeAsync(); } private void getFriends(){ Session activeSession = Session.getActiveSession(); if(activeSession.getState().isOpened()){ Request friendRequest = Request.newMyFriendsRequest(activeSession, new GraphUserListCallback(){ @Override public void onCompleted(List<GraphUser> users, Response response) { Log.i("INFO", response.toString()); } }); Bundle params = new Bundle(); params.putString("fields", "id,name,friends"); friendRequest.setParameters(params); friendRequest.executeAsync(); } }
- Recuperar foto de perfil con Facebook SDK 3.0 para Android
- Uso de Facebook app_link_hosts La respuesta de la API es 403 permisos de error - Android
- UnknownError: ApiException: El hash de claves **** no coincide ... cuando tengo la aplicación FB instalada
- Cómo invitar a los amigos de facebook a través de mi aplicación?
- Puntos finales de Google Cloud y autenticación del usuario
- Publicar en la pared de Facebook utilizando el API de gráfico no funciona
- Obtener imagen de perfil de Facebook Graph-API
- Android: Facebook siempre muestra que ya has autorizado el diálogo de la aplicación
En el método getFriends (), cambie esta línea:
params.putString("fields", "id,name,friends");
por
params.putString("fields", "id, name, picture");
Uso de la consulta FQL
String fqlQuery = "SELECT uid,name,pic_square FROM user WHERE uid IN " + "(SELECT uid2 FROM friend WHERE uid1 = me())"; Bundle params = new Bundle(); params.putString("q", fqlQuery); Session session = Session.getActiveSession(); Request request = new Request(session, "/fql", params, HttpMethod.GET, new Request.Callback(){ public void onCompleted(Response response) { Log.i(TAG, "Result: " + response.toString()); try{ GraphObject graphObject = response.getGraphObject(); JSONObject jsonObject = graphObject.getInnerJSONObject(); Log.d("data", jsonObject.toString(0)); JSONArray array = jsonObject.getJSONArray("data"); for(int i=0;i<array.length();i++){ JSONObject friend = array.getJSONObject(i); Log.d("uid",friend.getString("uid")); Log.d("name", friend.getString("name")); Log.d("pic_square",friend.getString("pic_square")); } }catch(JSONException e){ e.printStackTrace(); } } }); Request.executeBatchAsync(request);
Ref : Ejecutar consultas FQL
Esto debería funcionar:
// @Deprecated // Request.executeMyFriendsRequestAsync() // Use this instead: Request.newMyFriendsRequest(session, new GraphUserListCallback() { @Override public void onCompleted(List<GraphUser> users, Response response) { if(response.getError() == null) { for (int i = 0; i < users.size(); i++) { Log.e("users", "users " + users.get(i).getName()); } } else { Toast.makeText(MainActivity.this, response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show(); } } });
Desafortunadamente Facebook quita esos permisos.
/ Me / friends devuelve los amigos del usuario que también están utilizando tu aplicación.
En v2.0, el punto final API de amigos devuelve la lista de amigos de una persona que también están utilizando tu aplicación. En v1.0, la respuesta incluía a todos los amigos de una persona.
En v1.0, era posible pedir permisos que permitieran a una aplicación ver una cantidad limitada de datos de amigos, como los amigos de una persona, sus cumpleaños, etc.
En v2.0, todos los permisos han sido eliminados. Ya no es posible que una aplicación vea los datos de los amigos de una persona a menos que esos amigos también hayan iniciado sesión en la aplicación y concedido permiso para que la aplicación vea que los datos
https://developers.facebook.com/docs/apps/upgrading#v2_0_friendlist_title
Puedes usar mi código, necesitas usar la biblioteca de Facebook en tu proyecto. Todas las clases usadas para facebook están ahí en ese sdk.
private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state.isOpened()) { Log.i(TAG, "Logged in..."); Request.executeMyFriendsRequestAsync(session, new GraphUserListCallback() { @Override public void onCompleted(List<GraphUser> users, Response response) { Log.i("Response JSON", response.toString()); names = new String[users.size()]; id = new String[users.size()]; for (int i=0; i<users.size();i++){ names[i] = users.get(i).getName(); id[i]= users.get(i).getId(); } } }); } else if (state.isClosed()) { Log.i(TAG, "Logged out..."); } }
Nombres e ids son dos matrices de cadenas y ahora tienen todos los nombres e ids de los amigos. Espero que solucione su problema.
Para la persona preguntar cómo obtein el nombre y el apellido, necesita poner first_name y last_name en lugar de nombre.
params.putString("fields", "id, first_name, last_name, picture");
Utilice el siguiente código para obtener la lista de amigos de Facebook. Se mostrará sólo los datos de los usuarios que se ha hecho Facebook de inicio de sesión con la aplicación, y los usuarios tienen ID de Facebook en la base de datos. Entonces esto mostrará la lista de esos amigos.
FacebookFriendListActivity.java
package com.application.Activity; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.facebook.HttpMethod; import com.facebook.Request; import com.facebook.RequestBatch; import com.facebook.Response; import com.facebook.Session; import com.facebook.SessionDefaultAudience; import com.facebook.SessionLoginBehavior; import com.facebook.SessionState; import com.facebook.internal.SessionTracker; import com.facebook.internal.Utility; import com.facebook.model.GraphObject; import com.facebook.model.GraphUser; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import Info.InfoUsers; import india.application.upflair.Adapter.FindPeopleAdapter; import india.application.upflair.R; import utills.ConnectionDetector; import utills.Constant; public class FacebookFriendListActivity extends AppCompatActivity { //facebook section SessionTracker mSessionTracker; Session mCurrentSession = null; String facebook_id; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); signInWithFacebook(); } /*** * facebook section to get friend list */ private void signInWithFacebook() { mSessionTracker = new SessionTracker(getBaseContext(), new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { //TODO.. } }, null, false); String applicationId = Utility.getMetadataApplicationId(getBaseContext()); mCurrentSession = mSessionTracker.getSession(); mSessionTracker.setSession(null); Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build(); Session.setActiveSession(session); mCurrentSession = session; if (!mCurrentSession.isOpened()) { Session.OpenRequest openRequest = null; openRequest = new Session.OpenRequest(FacebookFriendListActivity.this); if (openRequest != null) { openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); openRequest.setPermissions(Arrays.asList("user_birthday", "email", "user_location", "user_friends")); openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); mCurrentSession.openForRead(openRequest); accessFacebookUserInfo(); } } else { accessFacebookUserInfo(); } } Request friendListRequest = null; private void accessFacebookUserInfo() { if (Session.getActiveSession() != null & Session.getActiveSession().isOpened()) { Request cover_request = new Request(Session.getActiveSession(), "me", null, HttpMethod.GET, new Request.Callback() { @Override public void onCompleted(Response response) {} }); Request.executeBatchAsync(cover_request); Request meRequest = Request.newMeRequest(Session.getActiveSession(),new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { try { friendListRequest.executeAsync(); } catch (Exception jex) { jex.printStackTrace(); } } }); RequestBatch requestBatch = new RequestBatch(meRequest); requestBatch.addCallback(new RequestBatch.Callback() { @Override public void onBatchCompleted(RequestBatch batch) {} }); requestBatch.executeAsync(); friendListRequest = new Request(Session.getActiveSession(), "/me/friends", null, HttpMethod.GET, new Request.Callback() { @Override public void onCompleted(Response response) { try { GraphObject graphObj = response.getGraphObject(); if (graphObj != null) { JSONObject jsonObj = graphObj.getInnerJSONObject(); JSONArray data=jsonObj.getJSONArray("data"); if(data.length()>0 && data!=null) { for(int i=0;i<data.length();i++) { JSONObject dataobj= data.getJSONObject(i); String name=dataobj.getString("name"); String id=dataobj.getString("id"); System.out.println("name==============" + name); System.out.println("id==============" + id); facebooklist.add(id); facebook_id = facebooklist.toString().replace("[", ""); facebook_id = facebook_id.replace("]", ""); } } } } catch (Exception e) { e.printStackTrace(); } } }); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); if (mCurrentSession.isOpened()) { accessFacebookUserInfo(); } else { Toast.makeText(mContext, "some thing went wrong plz try later", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(mContext, "some thing went wrong plz try later", Toast.LENGTH_LONG).show(); mCurrentSession = null; mSessionTracker.setSession(null); } } }
- Android Studio no muestra módulos en la estructura del proyecto
- Buscar contacto por número de teléfono