web-dev-qa-db-ja.com

Facebook SDKを使用してFacebookの写真、氏名、性別を取得する方法android

私はAndroidアプリケーションに取り組んでいます。このアプリケーションでは、アプリケーションを使用してFacebookにログインしているすべてのAndroidユーザーが、Facebookから写真、性別、氏名を抽出する必要があります。これにはFacebook SDKを使用しています。

Facebook SDKを使用してFacebookにログインできますが、Facebookから彼の写真、性別、氏名を抽出する方法がわかりませんか?

以下は、Facebookへのログインに使用しているコードです。私はこれに従いました チュートリアル

public class SessionLoginFragment extends Fragment {

    private static final String URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token=";

    private TextView textInstructionsOrLink;
    private Button buttonLoginLogout;
    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);

    buttonLoginLogout = (Button) view.findViewById(R.id.buttonLoginLogout);
    textInstructionsOrLink = (TextView) view.findViewById(R.id.instructionsOrLink);

    Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session == null) {
        if (savedInstanceState != null) {
        session = Session.restoreSession(getActivity(), null, statusCallback,
            savedInstanceState);
        }
        if (session == null) {
        session = new Session(getActivity());
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        }
    }

    updateView();

    return view;
    }

    @Override
    public void onStart() {
    super.onStart();
    Session.getActiveSession().addCallback(statusCallback);
    }

    @Override
    public void onStop() {
    super.onStop();
    Session.getActiveSession().removeCallback(statusCallback);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Session session = Session.getActiveSession();
    Session.saveSession(session, outState);
    }

    private void updateView() {
    Session session = Session.getActiveSession();
    if (session.isOpened()) {
        Log.d("Hello", URL_PREFIX_FRIENDS + session.getAccessToken());
        Intent i = new Intent(getActivity(), ThesisProjectAndroid.class);
        startActivity(i);

    } else {
        Log.d("Hello", "Login Failed");
        textInstructionsOrLink.setText(R.string.instructions);
        buttonLoginLogout.setText(R.string.login);
        buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickLogin();
        }
        });
    }
    }

    private void onClickLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
    } else {
        Session.openActiveSession(getActivity(), this, true, statusCallback);
    }
    }

    private void onClickLogout() {
    Session session = Session.getActiveSession();
    if (!session.isClosed()) {
        session.closeAndClearTokenInformation();
    }
    }

    private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        updateView();
    }
    }
}

必要な3つの情報すべてを取得するために、上記のクラスをどこで変更する必要があるのか​​、誰にも教えてもらえますか。私の知る限り、その人のfacebookの一意のIDを取得できれば、推測したすべての情報を取得できます。何かご意見は?

23
arsenal

StatusCallback関数では、GraphUserオブジェクトから詳細を取得できます

private class SessionStatusCallback implements Session.StatusCallback {
    private String fbAccessToken;

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        updateView();
        if (session.isOpened()) {
            fbAccessToken = session.getAccessToken();
            // make request to get facebook user info
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    Log.i("fb", "fb user: "+ user.toString());

                    String fbId = user.getId();
                    String fbAccessToken = fbAccessToken;
                    String fbName = user.getName();
                    String gender = user.asMap().get("gender").toString();
                    String email = user.asMap().get("email").toString();

                    Log.i("fb", userProfile.getEmail());
                }
            });
        }
    }
}
23
chrisbjr

新しいAPIとFacebookのカスタムボタンを使用すると、以下のコードを使用できます。

gradleファイルのgradleの下に配置します。

 compile 'com.facebook.Android:facebook-Android-sdk:4.20.0'

  Newer sdk does not need initializaion .

    private CallbackManager callbackManager;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(LoginActivity.this);//Is now depricated
    setContentView(R.layout.activity_login);
    callbackManager = CallbackManager.Factory.create();
    }

onActivityResult:

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

ボタンクリック:

   @Override
    public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.btn_f_sign_in_login:
            LoginManager.getInstance().logInWithReadPermissions(
                    this,
                    Arrays.asList("user_friends", "email", "public_profile"));

            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            setFacebookData(loginResult);
                        }

                        @Override
                        public void onCancel() {
                        }

                        @Override
                        public void onError(FacebookException exception) {
                        }
                    });
            break;
    }
}

setFacebookData:

     private void setFacebookData(final LoginResult loginResult)
       {
    GraphRequest request = GraphRequest.newMeRequest(
            loginResult.getAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    // Application code
                    try {
                        Log.i("Response",response.toString());

                        String email = response.getJSONObject().getString("email");
                        String firstName = response.getJSONObject().getString("first_name");
                        String lastName = response.getJSONObject().getString("last_name");
                        String gender = response.getJSONObject().getString("gender");



                        Profile profile = Profile.getCurrentProfile();
                        String id = profile.getId();
                        String link = profile.getLinkUri().toString();
                        Log.i("Link",link);
                        if (Profile.getCurrentProfile()!=null)
                        {
                            Log.i("Login", "ProfilePic" + Profile.getCurrentProfile().getProfilePictureUri(200, 200));
                        }

                       Log.i("Login" + "Email", email);
                        Log.i("Login"+ "FirstName", firstName);
                        Log.i("Login" + "LastName", lastName);
                        Log.i("Login" + "Gender", gender);


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,email,first_name,last_name,gender");
    request.setParameters(parameters);
    request.executeAsync();
}

アプリをダウンロードしたFacebook Friendsを取得:

replace parameters.putString( "fields"、 "id、email、first_name、last_name");

parameters.putString( "fields"、 "id、email、first_name、last_name、friends");

友達のデータを取得するために以下のロジックを追加します

                if (object.has("friends")) {
                  JSONObject friend = object.getJSONObject("friends");
                  JSONArray data = friend.getJSONArray("data");
                  for (int i=0;i<data.length();i++){
                 Log.i("idddd",data.getJSONObject(i).getString("id"));
                  }
             }
28
Rajat

新しいAPI

private void importFbProfilePhoto() {

    if (AccessToken.getCurrentAccessToken() != null) {

        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject me, GraphResponse response) {

                        if (AccessToken.getCurrentAccessToken() != null) {

                            if (me != null) {

                                String profileImageUrl = ImageRequest.getProfilePictureUri(me.optString("id"), 500, 500).toString();
                                Log.i(LOG_TAG, profileImageUrl);

                            }
                        }
                    }
                });
        GraphRequest.executeBatchAsync(request);
    }
}
5
Araik Grygorian

次のチュートリアルを参照

GraphUser-Objectを取得する要求を行う必要があります。このオブジェクトを使用すると、GraphUser user.getName();user.getId();などの必要な情報を取得できます。

1
mbecker

Sdk v4.28を使用し、問題のあるログインユーザーの場合、LoginManagerの成功コールバック内(またはその後)Profile.getCurrentProfile()を呼び出すのは簡単です。

facebookCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(facebookCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult{ 
                    //Profile.getCurrentProfile()
                }
                @Override
                public void onCancel() {
                }
                @Override
                public void onError(FacebookException exception) {
                }
            });

Graph Api を使用することもできますが、ドキュメント自体は上記のログインユーザーの使用を示しています。

1

nullプロファイルを取得する場合は、プロファイルトラッカーif(Profile.getCurrentProfile()== null){

            mProfileTracker = new ProfileTracker() {
                @Override
                protected void onCurrentProfileChanged(Profile profile, Profile profile2) {
                    // profile2 is the new profile
                    Log.d("facebook - profile", profile2.getFirstName());
                    profile_firstname=profile2.getFirstName();
                    profile_lastname=profile2.getLastName();
                   // Toast.makeText(LoginActivity.this, "User ID : "+ profile2.getFirstName(), Toast.LENGTH_LONG).show();
                    mProfileTracker.stopTracking();
                }
            };

        }
0
Vishal