web-dev-qa-db-fra.com

Obtenez une liste d'amis facebook 3.0

J'essaie d'obtenir ma liste d'amis de Facebook à l'aide du nouveau SDK (3.0). Je suis confronté à des problèmes liés au type de paramètres à insérer dans un bundle et à l'utilisation de newMyFriendRequest et GraphAPI.

Je n'ai pas trouvé sur la documentation de Facebook un endroit sur le type de champs que nous devons utiliser. Basé sur GraphExplorer j’insère dans mon ensemble les clés "fields" avec cette chaîne "id, name, friend" comme valeur. Le code ci-dessous montre ce que je fais en ce moment. Après avoir reçu ma photo et mon nom, j'exécute newMyFriendRequest. Je crois qu'il utilise GraphAPI par défaut.

J'ai vu ici sur StackOverflow quelques articles liés:

Comment envoyer une requête FQL avec le nouveau SDK Android

Paramètres de demande Facebook Android SDK: où trouver la documentation?

Cela m'aide peu et je ne veux pas utiliser FQL. Pour la réponse, je reçois ce JSON comme une réponse:

{Response:  responseCode: 500, graphObject: null, error: {HttpStatus: 500, errorCode: 100, errorType: FacebookApiException, errorMessage: Unsupported operation}, isFromCache:false}

Remarquez que je suis très nouveau dans le SDK Facebook pour 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();
    }
}
27
learner

Dans la méthode getFriends (), changez cette ligne:

params.putString("fields", "id,name,friends");

par

params.putString("fields", "id, name, picture");
22
ignacio_gs

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())";

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: Exécuter des requêtes FQL

11
Kirit Vaghela

Cela devrait fonctionner:

// @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();
        }
    }
});
8
Mohit Verma

Malheureusement, Facebook supprime ces autorisations.

/ me/friends renvoie les amis de l'utilisateur qui utilisent également votre application.

Dans la version 2.0, le point de terminaison de l'API friends renvoie la liste des amis d'une personne qui utilisent également votre application. Dans la version 1.0, la réponse incluait tous les amis d'une personne.

Dans la version 1.0, il était possible de demander des autorisations permettant à une application de voir un nombre limité de données d'amis, telles que les préférences de quelqu'un, ses anniversaires, etc.

En v2.0, ces autorisations ont toutes été supprimées. Il n'est plus possible pour une application de voir les données des amis d'une personne, sauf si ces amis se sont également connectés à l'application et ont donné l'autorisation à l'application de voir ces données.

https://developers.facebook.com/docs/apps/upgrading#v2_0_friendlist_title

6
Dennis Mathew

Vous pouvez utiliser mon code, vous devez utiliser la bibliothèque facebook dans votre projet. Toutes les classes utilisées pour facebook sont là dans ce 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...");
    }
}

les noms et les identifiants sont deux tableaux de chaînes et ont maintenant tous les noms et identifiants des amis. J'espère que cela résoudra votre problème.

4
Anas Azeem

Utilisez le code suivant pour obtenir la liste d'amis de Facebook. Ce sera affiche uniquement les données des utilisateurs qui ont été connectés à Facebook avec l'application, et les utilisateurs ont un identifiant Facebook sur la base de données. puis cela montrera la liste de ces amis.

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);
        }
    }



}
0
gAuRaV jAiN

Pour que la personne demande comment obtenir le prénom et le nom de famille, vous avez besoin de mettre prénom_nom et nom de famille au lieu de nom.

params.putString("fields", "id, first_name, last_name, picture");