Android:获取Facebook好友列表

13

我正在使用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."
 }
}

请参考此帖子以获取Facebook好友列表:https://dev59.com/32Yr5IYBdhLWcg3wGmeq#34354121 - gAuRaV jAiN
请参考此帖子以获取Facebook好友列表:https://dev59.com/32Yr5IYBdhLWcg3wGmeq#34354121 - gAuRaV jAiN
8个回答

12

你已经完成了大约一半的工作。你已经发送请求,但是你还没有定义任何接收响应结果的内容。你可以扩展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());

谢谢Kon,但是mFacebook.request("me/friends", bundle, new FriendListRequestListener())出错了,所以我尝试使用"mAsyncRunner"代替"mFacebook"。错误已经解决。 但是当我执行我的应用程序时,Listner方法仍然没有被调用。 有什么猜测吗? - Venkat Papana
嗨,Kon,你能回复一下吗...拜托了。 - Venkat Papana
嘿,这里的FacebookActivity到底是什么? - Aadi Droid
1
@Kon,我想获取Facebook用户的电子邮件地址列表,我该怎么做? - Ronak Mehta
有人解决了吗? 我仍然得到“BaseRequestListener无法解析为类型”的错误。 - shaby
@ kon:我得到了一个空数组..这意味着在数组中没有任何值..请帮帮我。 - Vaishali Sutariya

5

使用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); 

这里你设置了25的限制.. 这意味着会显示或获取到25个朋友的名称? - Vaishali Sutariya
是的,这将有助于您进行分页。 - Kirit Vaghela

2

我正在处理这个问题,然后找到了答案。 问题是你想要在没有先用你的Facebook令牌进行注册的情况下访问你的数据。

首先,你必须定义你的Facebook变量:

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

后来,定义你的AsyncFacebookRunner:

final AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);

好的,现在你必须使用authorize方法对你的请求进行授权。请注意,在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() {

        }
    });

你可以使用由@Kon发布的FriendListRequestListener类。
希望这能帮到你。
干杯!

2
定义一个 Facebook 对象的实例现在已经被弃用,不应该再使用。 - Jeremy


1

我昨天遇到了同样的问题。 我想知道你是否重写了onActivityResult()函数?

private Facebook mFacebook=null;

...
...
...

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

0

查看this答案,了解如何使用新的Facebook SDK 3.0 for Android获取Facebook好友列表以及这些好友中谁安装了您的应用程序。


0
如果有人在2015年末阅读这篇文章,答案和代码非常简单。请查看官方文档here(在代码窗口中点击Android SDK)。请记住,您需要拥有user_friends权限。
对于android-rx用户的小提示-同步获取您的好友,然后处理消息并返回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

我正在做类似这样的事情,它运行良好....

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

希望这对你有所帮助...


我收到了这个警告。你能给我提个建议吗?08-27 16:28:27.561: W/System.err(1286): com.facebook.android.FacebookError: 必须使用有效的访问令牌来查询有关当前用户的信息。 - G_S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接