Вопрос по facebook, android, facebook-graph-api, facebook-android-sdk – Получить список друзей facebook 3.0

27

Я пытаюсь получить список моих друзей из Facebook, используя новый SDK (3.0). Я'Я сталкиваюсь с проблемами, связанными с тем, какие параметры мне нужно вставить в Bundle и как использовать newMyFriendRequest и GraphAPI.

Я не'в документации на фейсбуке нет места о том, какое поле мы должны использовать. На основеGraphExplorer Я вставляю в свой Bundle ключ "поля» с этой строкойИдентификатор, имя, друг» как ценность. Код ниже показывает, что яЯ делаю прямо сейчас. После того как я получу свою фотографию и имя, я выполню newMyFriendRequest. Я считаю, что он использует GraphAPI по умолчанию.

Я видел здесь на StackOverflow некоторые сообщения, связанные:

Как отправить запрос FQL с новым Android SDK

Параметры запроса Android SDK Facebook: где найти документацию?

Это мало помогает мне, и я неЯ не хочу использовать FQL. Для ответа II 'Я получаю этот JSON как ответ:

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

Обратите внимание, яЯ очень новый в Facebook SDK для 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 users,
                        Response response) {
                    Log.i("INFO", response.toString());

                }
        });
        Bundle params = new Bundle();
        params.putString("fields", "id,name,friends");
        friendRequest.setParameters(params);
        friendRequest.executeAsync();
    }
}
@MingLi Хорошо работает с вашими наблюдениями. Я хочу получить список друзей и изображение профиля для каждого из них. Для этого я считаю, что мне нужно передать параметр в пакет. Если это правда, какой параметр мне нужно передать? Видите, фейсбук, как я уже сказал, плохо с этим типом документации. learner
Кажется, вы решили свою проблему, могу я спросить, как вы изменили свой код, чтобы он заработал? RRTW
тогда что вы хотитеИдентификатор, имя, фотография» для "поля» параметр. Вы также можете перейти кdevelopers.facebook.com/tools/explorer очень быстро опрашивать запросы (в этом случае я использовал / me / friends? fields = id, name, picture). Ming Li
@MingLi Хорошо, работает очень хорошо. learner
Вы пытались не устанавливать какие-либо параметры? Идентификатор и имя там по умолчанию, так что вы нене нужно их просить. Я недумаюдрузья» является допустимым полем. Попробуйте полностью удалить Bundle и setParameters, и просто вызовите friendRequest.executeAsync (). Ming Li

Ваш Ответ

7   ответов
4

Вы можете использовать мой код, вам нужно использовать библиотеку facebook в вашем проекте. Все классы, используемые для Facebook, есть в этом 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 users,
                            Response response) {
                        Log.i("Response JSON", response.toString());
                        names = new String[users.size()];
                        id = new String[users.size()];
                        for (int i=0; i

Имена и идентификаторы - это два строковых массива, и теперь они имеют все имена и идентификаторы друзей. Я надеюсь, что это решит вашу проблему.

Не работает. Это устарело, и теперь оно возвращает только тех друзей, которые используют приложение, откуда вы вызываете API. Oscar S.
чувак, ты потрясающий. Большое спасибо! Filip Luchianenco
@FilipLuch рад, что вы решили свою вещь Anas Azeem
0

чтобы человек спросил, как получить имя и фамилию, вам нужно указать имя и фамилию вместо имени.

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

Используйте следующий код, чтобы получить список друзей из Facebook. Он будет показывать только данные тех пользователей, которые выполнили вход на Facebook с помощью приложения, а пользователи имеют идентификатор Facebook 'с в базе данных. тогда это покажет список тех друзей.

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
11

Использование FQL-запроса

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);="" <="" code=""></array.length();i++){>

Ref:Запустить FQL-запросы

@JayR это новый Facebookполитика Andre Figueiredo
Привет! Я просто хочу спросить, почему этот код возвращает только друзей из Facebook, которые также дают разрешение на приложение? Почему это не таквместо этого вернуть всех друзей из фейсбука? Спасибо JayR
22

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

от

params.putString("fields", "id, name, picture");
Да, добавьте поля: first_name и last_name в запрос marsbear
попробуйте использовать это может решитьparams.putString("fields", "id, first_name, last_name, picture"); Sagar
@ignacio_gs, как я могу получить электронную почту моего друга? Ankit Sharma
Есть ли способ получить имя и фамилию друзей user1767260
8

Это должно работать:

// @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();
        }
    }
});
</graphuser>
@Mohit Verma Я работаю на Facebook с новым Facebook SDK, но я не могу получить список моих друзей. есть идеи по этому поводу? Gorgeous_DroidVirus
@prateek Как и выше -GraphUserListCallback такой же, как в Мохит Вермаответ. ПолучаетonCompleted вызов, когда запрос завершается, либо с успехом, либо с ошибкой. karl
Этот метод устарел, хотя он работает. noob
@karl Как получить результатexecuteAsync() or executeAndWait() Я имею в виду, какой метод обратного вызова вызывается в результате? Prateek
6

/ me / friends возвращает пользователя 'Друзья, которые также используют ваше приложение.

В версии 2.0 конечная точка API друзей возвращает список людей.Друзья, которые также используют ваше приложение. В версии 1.0 ответ включал в себяс друзьями.

В версии 1.0 можно было запрашивать разрешения, которые позволили бы приложению видеть ограниченный объем данных о друзьях, например о человеке.с другомДрузья, их дни рождения и так далее.

В версии 2.0 все эти разрешения были удалены. Это'Приложение больше не может видеть данные человекаДрузья, если только эти друзья не вошли в приложение и не предоставили ему разрешение на просмотр этих данных.

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

Похожие вопросы