簡體   English   中英

獲取好友列表facebook 3.0

[英]Get friend list facebook 3.0

我正在嘗試使用新的SDK(3.0)從facebook獲取我的朋友列表。 我遇到了與我需要在Bundle中插入什么類型的params以及如何使用newMyFriendRequest和GraphAPI相關的問題。

我沒有在facebook文檔中找到關於我們必須使用哪種字段的地方。 基於GraphExplorer,我在我的Bundle中插入了帶有“id,name,friend”字符串的鍵“fields”作為值。 下面的代碼顯示了我現在正在做的事情。 在我得到我的照片和名字后,我執行newMyFriendRequest。 我相信它默認使用GraphAPI。

我在StackOverflow上看過一些相關帖子:

如何使用新的Android SDK發送FQL查詢

Facebook Android SDK請求參數:在哪里查找文檔?

它對我幫助很小,我不想使用FQL。 對於響應II我收到這個JSON就像一個答案:

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

請注意,我是Facebook SDK for Android的新手。

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

在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刪除了這些權限

/ me / friends返回同時使用您的應用的用戶的朋友。

在v2.0中,朋友API端點返回正在使用您的應用的人的朋友列表。 在v1.0中,響應包括所有人的朋友。

在v1.0中,可以要求允許應用查看有限數量的朋友數據的權限,例如某人的朋友喜歡,他們的生日等等。

在v2.0中,這些權限都已被刪除。 應用程序不再可能看到來自某個人的朋友的數據,除非這些朋友也登錄到應用程序並授予該應用程序查看該數據的權限

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

names和id是兩個String數組,現在擁有所有朋友的名字和id。 我希望它能解決你的問題。

對於該人詢問如何使用名字和姓氏,您需要輸入first_name和last_name而不是name。

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

使用以下代碼從Facebook獲取好友列表。 它將僅顯示已使用該應用程序完成Facebook登錄的用戶的數據,並且用戶在數據庫上具有Facebook ID。 然后這將顯示那些朋友的列表。

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



}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM