私は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を取得できれば、推測したすべての情報を取得できます。何かご意見は?
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());
}
});
}
}
}
新しい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"));
}
}
新しい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);
}
}
GraphUser-Objectを取得する要求を行う必要があります。このオブジェクトを使用すると、GraphUser user.getName();
、user.getId();
などの必要な情報を取得できます。
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 を使用することもできますが、ドキュメント自体は上記のログインユーザーの使用を示しています。
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();
}
};
}