【问题标题】:Android: get facebook friends listAndroid:获取 facebook 好友列表
【发布时间】:2011-06-04 10:42:01
【问题描述】:

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

【问题讨论】:

标签: android facebook


【解决方案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());

【讨论】:

  • 谢谢 Kon,但是 mFacebook.request("me/friends", bundle, new FriendListRequestListener());给出错误,所以我尝试使用“mAsyncRunner”而不是“mFacebook”。错误已解决。但是当我执行我的应用程序时,Listner 方法仍然没有被调用。有什么猜测吗?
  • Hi Kon,你能回复一下吗...请
  • 嘿,这里的 FacebookActivity 到底是什么?
  • @Kon 我想获取 Fb 用户的电子邮件地址列表,我该怎么做。
  • 嘿,有人解决了吗?尽管如此,我仍然无法将 BaseRequestListener 解析为类型。
【解决方案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); 

【讨论】:

  • 这里你放了 25 个限制.. 这意味着 25 个朋友的名字被显示出来了?
  • 是的,这将帮助您进行分页
【解决方案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() {

        }
    });

您可以使用@Kon 发布的 FriendListRequestListener 类

我希望这会有所帮助。

干杯!

【讨论】:

  • 现在不推荐使用定义 Facebook 对象的实例。
【解决方案4】:
【解决方案5】:

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

private Facebook mFacebook=null;

...
...
...

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      我正在做这样的事情,效果很好......

                          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: 必须使用活动访问令牌来查询有关当前用户的信息。
      【解决方案8】:

      如果有人在 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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-06
        • 1970-01-01
        • 2014-11-15
        • 2015-03-16
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多