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.

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

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.

  • Android JSON CharSet UTF-8 problemas
  • Tipo Advertencia de seguridad con Iterator JSON
  • Retrofit 2.0 java.lang.IllegalStateException: Se esperaba BEGIN_ARRAY pero era STRING
  • ¿Cómo analizar la respuesta de json usando Jackson en android?
  • Android: ¿cuál es la mejor manera de almacenar los datos de JSON sin conexión para la aplicación en android?
  • Xamarin Android deserializa el archivo json local
  • Pojo analiza gson con nombres de java no válidos
  • Gson .JsonSyntaxException - java.lang.NumberFormatException: Doble no válido: ""
  • JSONObject.toString: cómo no escapar de barras
  • Determine si JSON es un JSONObject o JSONArray
  • Iterate Json datos del servicio web en el orden correcto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.