Ich versuche, meine Freundesliste von Facebook mit dem neuen SDK (3.0) abzurufen. Ich bin mit Problemen konfrontiert, welche Art von Parametern ich in ein Bundle einfügen muss und wie man newMyFriendRequest und GraphAPI verwendet.
Ich habe auf Facebook-Dokumentation keinen Platz darüber gefunden, welches Feld wir verwenden müssen. Basierend auf GraphExplorer füge ich in meinem Bundle den Schlüssel "fields" mit dieser Zeichenfolge "id, name, friend" als Wert ein. Der folgende Code zeigt, was ich gerade mache. Nachdem ich mein Bild und meinen Namen erhalten habe, führe ich newMyFriendRequest aus. Ich glaube, es verwendet standardmäßig GraphAPI.
Ich habe hier auf StackOverflow einige Beiträge gesehen, die sich auf Folgendes beziehen:
So senden Sie eine FQL-Abfrage mit dem neuen Android SDK
Facebook Android SDK-Anforderungsparameter: Wo finde ich Dokumentation?
Es hilft mir wenig und ich möchte FQL nicht verwenden. Zur Antwort empfange ich diese JSON wie eine Antwort:
{Response: responseCode: 500, graphObject: null, error: {HttpStatus: 500, errorCode: 100, errorType: FacebookApiException, errorMessage: Unsupported operation}, isFromCache:false}
Ich bin in Facebook SDK für Android sehr neu.
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();
}
}
Ändern Sie in der getFriends () -Methode diese Zeile:
params.putString("fields", "id,name,friends");
durch
params.putString("fields", "id, name, picture");
FQL-Abfrage verwenden
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);
Das sollte funktionieren:
// @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();
}
}
});
Leider entfernen Facebook diese Berechtigungen.
/ me/friends gibt die Freunde des Benutzers zurück, die auch Ihre App verwenden.
In Version 2.0 gibt der Freunde-API-Endpunkt die Liste der Freunde einer Person zurück, die auch Ihre App verwenden. In v1.0 umfasste die Antwort alle Freunde einer Person.
In Version 1.0 war es möglich, nach Berechtigungen zu fragen, die es einer App erlauben, eine begrenzte Anzahl von Freundesdaten anzuzeigen, z. B. die Vorlieben eines Freundes einer Person, deren Geburtstage usw.
In Version 2.0 wurden alle diese Berechtigungen entfernt. Es ist nicht mehr möglich, dass eine App Daten von Freunden einer Person anzeigt, es sei denn, diese Freunde haben sich auch bei der App angemeldet und haben der App die Erlaubnis erteilt, diese Daten zu sehen
https://developers.facebook.com/docs/apps/upgrading#v2_0_friendlist_title
Sie können meinen Code verwenden, Sie müssen die Facebook-Bibliothek in Ihrem Projekt verwenden. Alle für Facebook verwendeten Klassen sind in dieser SDK enthalten.
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...");
}
}
namen und IDs sind zwei String-Arrays und haben jetzt alle Namen und IDs der Freunde. Ich hoffe es löst dein Problem.
Verwenden Sie den folgenden Code, um die Freundesliste von Facebook abzurufen. Es wird Nur die Daten der Benutzer anzeigen, die sich bei Facebook angemeldet haben mit der App, und die Benutzer haben Facebook-IDs in der Datenbank. dann Daraufhin wird die Liste dieser Freunde angezeigt.
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);
}
}
}
Für die Person, die fragt, wie der Vorname und der Nachname abgerufen werden sollen, müssen Sie anstelle des Namens den Namen first_name und last_name eingeben.
params.putString("fields", "id, first_name, last_name, picture");