Android Facebook Graph api información básica que solicita
Solo tratando de permitir que mi aplicación acceda a la información básica de un usuario de Facebook autenticado, sin embargo, mi logcat me dice
06-30 16: 37: 27.969: WARN / System.err (1559): com.facebook.android.FacebookError: Se debe utilizar un token de acceso activo para consultar información sobre el usuario actual.
- ¿Por qué recibo una respuesta vacía cuando mi aplicación android llama a mi API en mi servidor?
- Android crea una cadena Json
- JSON publica en Rails desde Android
- Inicio de una actividad en onPostExecute
- Tiempo de viaje entre dos ubicaciones en Google Map Android API V2
Justo después de la autenticación donde se ejecuta el código. ¿Alguien me puede apuntar en la dirección correcta? He visto un post muy similar donde alguien utiliza código casi idéntico y funcionó.
Gracias
Facebook facebook = new Facebook("187212574660004"); TextView nText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nText = (TextView) this.findViewById(R.id.nameText); facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"}, new DialogListener() { public void onComplete(Bundle values) { setContentView(R.layout.homepage); } public void onFacebookError(FacebookError error) {} public void onError(DialogError e) {} public void onCancel() {} }); JSONObject json_data = null; try { JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook JSONArray jArray = response.getJSONArray("data"); json_data = jArray.getJSONObject(0); String name = json_data.getString("name"); Log.i("friend is", name); nText.setText(name); } catch (MalformedURLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (FacebookError e) { e.printStackTrace(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); }
Intentó el método descrito por Manno23 y obtuvo
06-30 19:27:04.338: ERROR/AndroidRuntime(349): Caused by: java.lang.NullPointerException 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.getFriends(FacebookPage.java:67) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.access$0(FacebookPage.java:55) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage$1.onComplete(FacebookPage.java:41) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.facebook.android.Facebook.authorizeCallback(Facebook.java:383) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.onActivityResult(FacebookPage.java:93) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.Activity.dispatchActivityResult(Activity.java:3907) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.ActivityThread.deliverResults(ActivityThread.java:2492) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): ... 11 more
- JSON.stringify en java - android
- ¿Cómo se calcula el tiempo del rezo musulmán en una aplicación androide?
- FlexJson ClassNotFound Exception en Android 4.4.4
- Android Volley método de eliminación, ¿por qué enviar parámetros vacíos
- Cómo analizar correctamente la API de Reddit en Android
- Cargando muchas imágenes del servidor en Android
- Retrofit: Se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY
- Convertir InputStream a JSONObject
Ambas respuestas son correctas. Sólo puede poner el trozo de código que hace la solicitud en un método separado y llamar a ese método en onComplete (), es decir
Facebook facebook = new Facebook("XXXXXasdasdajksdad"); TextView nText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nText = (TextView) this.findViewById(R.id.nameText); facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"}, new DialogListener() { public void onComplete(Bundle values) { getFriends(); setContentView(R.layout.homepage); } public void onFacebookError(FacebookError error) {} public void onError(DialogError e) {} public void onCancel() {} }); } private void getFriends(){ JSONObject json_data = null; try { JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook JSONArray jArray = response.getJSONArray("data"); json_data = jArray.getJSONObject(0); String name = json_data.getString("name"); Log.i("friend is", name); nText.setText(name); } catch (MalformedURLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (FacebookError e) { e.printStackTrace(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); }
Hay mucho mal con esto, pero creo que lo primero y lo más importante para ti es comprender que la llamada a autorizar es asíncrona.
Esto significa que onComplete () se llama en un momento distante en el futuro. Sus solicitudes de facebook se producen "después" de la definición de devolución de llamada para onComplete () en el código, pero ver cómo es asíncrona esas llamadas van a pasar waaay antes de la red de solicitud de inicio de sesión de Facebook vuelve lo que significa que no tiene un token de autenticación Cuando usted hace esa petición.
* Debo agregar que DialogListener es una clase de connivence escrita por facebook para actuar como una forma de manejar devoluciones de llamada para llamadas asíncronas.
Simplemente llame a facebook.request("me/friends")
desde dentro onComplete y deje que el resto de la lógica siga de eso.
De esa manera sólo se llamará una vez que el Facebook
onject tiene un token de acceso y no si hay un error o algo así. Es probable que desee utilizar las otras devoluciones de llamada en el DialogListener
para obtener un flujo mejor. También piensa en mantener ese objeto de facebook en toda la aplicación si planeas hacer más peticiones.
- ExpandableListView con arrastrar y soltar de elementos de la lista en Android
- Obtener código de país