Android: получите список друзей в facebook

Я использую Facebook SDK для размещения сообщений на стенах.

Теперь мне нужно найти список друзей Facebook. Может ли кто-нибудь помочь мне в этом?

- Изменить -

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

Когда я выполняю мой activity, я ничего не вижу, но в LogCat появляется сообщение об отладке вроде:

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

И когда я попытался получить доступ к этому URL прямо из браузера, я получаю следующий ответ об ошибке:

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

Ответы

Ответ 1

Ты примерно на полпути. Вы отправили запрос, но вы ничего не определили, чтобы получить ответ с вашими результатами. Вы можете расширить класс BaseRequestListener и реализовать его метод onComplete для этого. Что-то вроде этого:

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

Затем в вашем запросе вы можете указать прослушиватель запросов, который будет использоваться для получения ответа от запроса, например:

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

Ответ 2

Использование запроса 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); 

Ответ 3

Я имел дело с этим, и я нашел ответ. Проблема в том, что вы хотите получить доступ к своим данным без предварительной регистрации с помощью токена facebook.

Во-первых, вы должны определить свою переменную Facebook:

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

Позже определите свой AsyncFacebookRunner:

final AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);

Хорошо, теперь вы должны авторизовать свой запрос с помощью метода autorize. Обратите внимание, что вы должны реализовать методы обратного вызова на DialogListener(), обратить внимание на метод onComplete(). В этом методе вы должны запустить запрос на выбор друга. Теперь ваш запрос пройдет, потому что теперь вы авторизованы. Теперь код:

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() {

        }
    });

Вы можете использовать класс FriendListRequestListener, который был отправлен @Kon

Надеюсь, это поможет.

Ура!

Ответ 5

Я столкнулся с той же проблемой вчера. Мне интересно, если вы переопределили функцию onActivityResult()?

private Facebook mFacebook=null;

...
...
...

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

Ответ 6

Я делаю что-то вроде этого, работает хорошо....

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

Надеюсь, что это полезно...

Ответ 7

Отметьте этот ответ, чтобы узнать, как получить список друзей Facebook, и кто из этих друзей установил ваше приложение, используя новый Facebook SDK 3.0 для Android.

Ответ 8

Если кто-то читает это в конце 2015 года, ответ и код довольно просты. Взгляните на официальную документацию здесь (в окне кода щелкните Android SDK). Имейте в виду, что вам необходимо иметь разрешение user_friends.

Совет для пользователей android-rx - синхронизировать своих друзей, а затем обрабатывать сообщение и возвращать. Наблюдаемое:

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