web-dev-qa-db-fra.com

Android: obtenir la liste d'amis facebook

J'utilise le Facebook SDK pour publier des messages sur les murs.

Maintenant, je dois aller chercher la liste d'amis Facebook. Quelqu'un peut-il m'aider avec ça?

-- Modifier --

try {

  Facebook mFacebook = new Facebook(Constants.FB_APP_ID);
  AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);
  Bundle bundle = new Bundle();
  bundle.putString("fields", "birthday");
  mFacebook.request("me/friends", bundle);

} catch(Exception e){
    Log.e(Constants.LOGTAG, " " + CLASSTAG + " Exception = "+e.getMessage());
}

Lorsque j'exécute ma activity, je ne vois rien, mais dans LogCat, il y a un message de débogage du type: 

06-04 17:43:13.863: DEBUG/Facebook-Util(409): GET URL: https://graph.facebook.com/me/friends?format=json&fields=birthday

Et quand j'ai essayé d'accéder à cette URL directement à partir du navigateur, j'obtiens la réponse d'erreur suivante:

{
  error: {
  type: "OAuthException"
  message: "An active access token must be used to query information about the current user."
 }
}
13
Venkat Papana

Vous êtes à mi-chemin. Vous avez envoyé la demande, mais vous n'avez rien défini pour recevoir la réponse avec vos résultats. Vous pouvez étendre la classe BaseRequestListener et implémenter sa méthode onComplete pour le faire. Quelque chose comme ça: 

public class FriendListRequestListener extends BaseRequestListener {

    public void onComplete(final String response) {
        _error = null;

        try {
            JSONObject json = Util.parseJson(response);
            final JSONArray friends = json.getJSONArray("data");

            FacebookActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    // Do stuff here with your friends array, 
                    // which is an array of JSONObjects.
                }
            });

        } catch (JSONException e) {
            _error = "JSON Error in response";
        } catch (FacebookError e) {
            _error = "Facebook Error: " + e.getMessage();
        }

        if (_error != null)
        {
            FacebookActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    Toast.makeText(getApplicationContext(), "Error occurred:  " + 
                                    _error, Toast.LENGTH_LONG).show();
                }
            });
        }
    }
}

Ensuite, dans votre demande, vous pouvez spécifier le programme d'écoute à utiliser pour recevoir la réponse de la demande, comme suit: 

mFacebook.request("me/friends", bundle, new FriendListRequestListener());
12
Kon

Utilisation de la requête FQL

String fqlQuery = "SELECT uid, name, pic_square FROM user WHERE uid IN " +
        "(SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 25)";

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); 
5
Kirit Vaghela

J'avais affaire à cela et j'ai trouvé la réponse. Le problème est que vous voulez accéder à vos données sans inscription préalable avec votre token facebook.

Tout d'abord, vous devez définir votre variable Facebook:

Facebook mFacebook = new Facebook(getString(R.string.fb_id));

Ensuite, définissez votre AsyncFacebookRunner:

final AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);

Ok, maintenant vous devez autoriser votre demande, avec la méthode autorize. Notez que vous devez implémenter des méthodes de rappel sur DialogListener (), faites attention à la méthode onComplete (). Sur cette méthode, vous devez exécuter la demande de récupération d'amis. Maintenant, votre demande sera acceptée car vous êtes maintenant authentifié. Maintenant, le code:

mFacebook.authorize(this, fb_perms, new DialogListener(){
        /**
         * Triggered on a successful Facebook registration. 
         */
        public void onComplete(Bundle values) {
            mAsyncRunner.request("me/friends", new FriendListRequestListener());
        }

        /**
         * Triggered on a FacebookError.
         */
        public void onFacebookError(FacebookError e) {

        }

        /**
         * Triggered on a DialogError.
         */
        public void onError(DialogError e) {

        }

        /**
         * Triggered when the User cancels the Facebook Login.
         */
        public void onCancel() {

        }
    });

Vous pouvez utiliser la classe FriendListRequestListener qui a été postée par @Kon

J'espère que ça aide.

À votre santé!

2
Skycorsarius
1
Nikhil

J'ai rencontré le même problème hier. Je me demande si vous avez annulé la fonction onActivityResult()?

private Facebook mFacebook=null;

...
...
...

@Override
protected void onActivityResult(int requestCode, 
                                int resultCode,
                                Intent data) {
    mFacebook.authorizeCallback(requestCode, resultCode, data);
}
1
ultimasquare

Vérifiez ceci répondez afin de savoir comment obtenir la liste d'amis Facebook et qui de ces amis a installé votre application à l'aide du nouveau Kit de développement logiciel (SDK) Facebook 3.0 pour Android.

0
JPMagalhaes

Si quelqu'un lit ceci à la fin de 2015, la réponse et le code sont assez simples. Consultez la documentation officielle ici (dans la fenêtre du code, cliquez sur Android SDK). N'oubliez pas que vous devez avoir l'autorisation de user_friends.

Petit conseil pour les utilisateurs d’Android-rx - récupérez vos amis de manière synchrone, puis traitez le message et renvoyez Observable:

public Observable<List<Friend>> execute() {
    return Observable.defer(new Func0<Observable<List<Friend>>>() {
        @Override
        public Observable<List<Friend>> call() {
            AccessToken a = AccessToken.getCurrentAccessToken();
            if (Utils.isValid(a)) {
                try {
                    GraphResponse res = new GraphRequest(AccessToken.getCurrentAccessToken(), "me/friends").executeAndWait();

                    // process result          

                    return Observable.just(your friend list);
                } catch (Exception e) {
                   // notify user or load again
                }
            }
            // invalid access token -> notify user
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
0
vanomart

Je fais quelque chose comme ça marche bien .... 

                    jsonObj = Util.parseJson(facebook.request("me/friends"));

                    JSONArray jArray = jsonObj.getJSONArray("data");
                    for(int i=0;i<jArray.length();i++){

                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.v("THIS IS DATA", i+" : "+jArray.getJSONObject(i));
                     }

J'espère que c'est utile ...

0
Vivekanand