获取朋友列表脸书3.0

我试图从Facebook使用新的SDK(3.0)获得我的朋友列表。 我遇到了一些问题,涉及到我需要在Bundle中插入什么types的参数以及如何使用newMyFriendRequest和GraphAPI。

我没有在Facebook上find关于我们必须使用哪种字段的地方。 基于GraphExplorer,我在我的Bundle中插入了这个string“id,name,friend”作为值的关键字段。 下面的代码显示了我现在正在做的事情。 当我得到我的照片和名字后,我执行newMyFriendRequest。 我相信它默认使用GraphAPI。

我在StackOverflow上看到了一些相关的post:

如何使用新的Android SDK发送FQL查询

Facebook Android SDK请求参数:在哪里查找文档?

它帮助我很less,我不想使用FQL。 对于响应II'm接收这个JSON就像一个答案:

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

注意我在Android的Facebook SDK中很新颖。

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

Solutions Collecting From Web of "获取朋友列表脸书3.0"

在getFriends()方法中,更改此行:

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

通过

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

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

参考 : 运行FQL查询

这应该工作:

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

不幸的是Facebook删除这些权限。

/我/朋友返回也在使用您的应用程序的用户的朋友。

在2.0版中,朋友API端点返回也在使用您的应用程序的朋友的列表。 在v1.0中,回复包括了一个人的所有朋友。

在v1.0中,有可能要求允许应用程序查看有限数量的朋友数据的权限,比如某人的朋友的喜欢,他们的生日等等。

在v2.0中,这些权限全部被删除。 应用程序不再可以查看来自某个人的朋友的数据,除非这些朋友也login了该应用程序,并授予该应用程序查看该数据的权限

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

你可以使用我的代码,你需要在你的项目中使用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<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..."); } } 

名称和ID是两个string数组,现在有所有的朋友的名字和ID。 我希望它能解决你的问题。

对于这个人问你的名字和姓氏有多混杂,你需要把first_name和last_name代替名字。

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

使用下面的代码从Facebook获取好友列表。 它将只显示已经完成Facebooklogin的用户的数据,并且用户在数据库上有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<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); } } }