新しいSDK(3.0)を使用してFacebookから友達リストを取得しようとしています。バンドルに挿入する必要があるパラメーターの種類と、newMyFriendRequestおよびGraphAPIの使用方法に関連する問題に直面しています。
Facebookのドキュメントには、どのような分野を使用する必要があるのかがわかりませんでした。 GraphExplorer に基づいて、この文字列「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);
Ref: 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では、friends 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...");
}
}
名前とIDは2つのString配列であり、友人のすべての名前とIDを持ちます。それがあなたの問題を解決することを願っています。
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);
}
}
}
人が名と姓をどのように取得するかを尋ねるには、名前の代わりにfirst_nameとlast_nameを入力する必要があります。
params.putString("fields", "id, first_name, last_name, picture");