2011-11-16 18 views
6

Tengo un problema para acceder al API de gráficos a través de mi aplicación Android que recupera los amigos de un usuario como JSONObject, extrae sus nombres y los muestra en la pantalla. Se supone que es una tarea simple y directa, pero aparentemente no lo es. Cuando ejecuto mi aplicación en Android Nexus I, inicio sesión en Facebook, luego me piden que haga clic en el botón "Permitir" para otorgar los permisos y me redirigen a una página en blanco. Espero ver el nombre de mis amigos, pero no sucede. ¿Podría alguien ayudarme?No puedo acceder a amigos de Facebook a través de la aplicación de Android

public class Login extends Activity 
{ 
    Facebook mFacebook = new Facebook("201509899926116"); 
    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
    String FILENAME = "AndroidSSO_data"; 
    private SharedPreferences mPrefs; 
    View linearLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     linearLayout = findViewById(R.id.main_layout); 

     /* Get existing access_token if any */ 
     mPrefs = getPreferences(MODE_PRIVATE); 
     String access_token = mPrefs.getString("access_token", null); 
     long expires = mPrefs.getLong("access_expires", 0); 

     if(access_token != null) 
     { 
      mFacebook.setAccessToken(access_token); 
     } 
     if(expires != 0) 
     { 
      mFacebook.setAccessExpires(expires); 
     } 

     /* Only call authorize if the access_token has expired. */ 
     if(!mFacebook.isSessionValid()) 
     { 
      mFacebook.authorize(this, new String[] {"user_birthday","email", 
        "user_relationships","user_religion_politics","user_hometown", 
        "user_location","user_relationship_details","user_education_history", 
        "user_likes","user_interests", "user_activities"}, 
        new DialogListener() 
      { 

       @Override 
       public void onComplete(Bundle values) 
       { 
        SharedPreferences.Editor editor = mPrefs.edit(); 
        editor.putString("access_token", mFacebook.getAccessToken()); 
        editor.putLong("access_expires", mFacebook.getAccessExpires()); 
        editor.commit(); 

        /* access the graph API */ 
        Log.d("Facebook-Example-Friends Request", "Started API request"); 
        mAsyncRunner.request("me/friends", new FriendsRequestListener()); 
        Log.d("Facebook-Example-Friends Request", "Finished API request"); 
       } 

       @Override 
       public void onFacebookError(FacebookError error) {} 

       @Override 
       public void onError(DialogError e) {} 

       @Override 
       public void onCancel() {} 
      }); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 
     mFacebook.authorizeCallback(requestCode, resultCode, data); 
    } 

    public class FriendsRequestListener implements com.facebook.android.AsyncFacebookRunner.RequestListener 
    { 
     /** 
     * Called when the request to get friends has been completed. 
     * Retrieve and parse and display the JSON stream. 
     */ 
     public void onComplete(final String response) 
     { 
      try 
      { 
       // process the response here: executed in background thread 
       Log.d("Facebook-Example-Friends Request", "response.length(): " + response.length()); 
       Log.d("Facebook-Example-Friends Request", "Response: " + response); 

       final JSONObject json = new JSONObject(response); 
       JSONArray d = json.getJSONArray("data"); 
       int l = (d != null ? d.length() : 0); 
       Log.d("Facebook-Example-Friends Request", "d.length(): " + l); 

       for (int i=0; i<l; i++) 
       { 
        JSONObject o = d.getJSONObject(i); 
        String n = o.getString("name"); 
        String id = o.getString("id"); 

        TextView tv = new TextView(Login.this); 
        tv.setText(n); 
        ((LinearLayout) linearLayout).addView(tv); 
       }    
      } 
      catch (JSONException e) 
      { 
       Log.w("Facebook-Example", "JSON Error in response"); 
      } 
     } 
    } 
} 
+0

Cuando se está depurando, es lo que realmente dio en el método de devolución de llamada onComplete en la Solicitud de amigo oyente? –

+0

Oye, si mi respuesta ayudó a solucionarlo, debe marcarlo como la respuesta aceptada (haciendo clic en la marca de verificación junto a la respuesta) –

Respuesta

2

Creo que he encontrado el problema. De acuerdo con la documentación en onComplet;

 /** 
    * Called when a request completes with the given response. 
    * 
    * Executed by a background thread: do not update the UI in this method. 
    */ 

y que está tratando de actualizar la interfaz de usuario, por lo addViews en realidad no se reflejan en el subproceso de interfaz de usuario .. Debe crear un método en su actividad que se puede llamar desde onComplete con runOnUIThread .. Algo así como esta;

runOnUiThread(new Runnable() { 
      public void run() { 
       inserFacebookNames(facebookContactNames); 
      } 
     }); 

Vamos a saber si esto realmente lo fija .. Estoy ansioso por ver si esa fue la razón ..

+0

Gracias por su respuesta. ¡Está arreglado! – NewToAndroid

+0

Quizás debería marcar esta respuesta como aceptada entonces? Puede hacerlo haciendo clic en la marca de verificación verde. – Silox

Cuestiones relacionadas