java - Facebook 登录 加载用户资料

标签 java facebook authentication

当我通过 Facebook 登录时,我应该从 Facebook 获取一些数据,例如我的电子邮件、姓名和个人资料图片。但是,现在添加这些代码后我无法再获取数据

@Override
            public void onSuccess(LoginResult loginResult) {

                final AccessToken accessToken = loginResult.getAccessToken();
                GraphRequestAsyncTask request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject user, GraphResponse graphResponse) {
                        LoginManager.getInstance().logOut();
                    }
                }).executeAsync();


                Toast.makeText(getApplicationContext(), "Login Success with Facebook", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(LoginScreen.this, MainActivity.class));

            }

我应该在此 Activity 中获取这些 Facebook 数据

package com.example.musix.Musix;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.musix.MainActivity;
import com.example.musix.R;
import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.google.firebase.auth.FirebaseAuth;

import org.json.JSONException;
import org.json.JSONObject;

public class ViewProfile extends AppCompatActivity {

    private ImageView circleImageView;
    private TextView txtName,txtEmail;

    private ImageButton Home;
    private ImageButton Playlist;

    private FirebaseAuth firebaseAuth;
    private Button logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_profile);

        circleImageView = (ImageView) findViewById(R.id.profile_icon);
        txtName = findViewById(R.id.profile_name);
        txtEmail = findViewById(R.id.profile_email);

        Home = (ImageButton)findViewById(R.id.home);
        Playlist = (ImageButton)findViewById(R.id.playlisticon);

        firebaseAuth = FirebaseAuth.getInstance();

        logout = (Button)findViewById(R.id.btnLogout);

        //go to LoginScreen page
        logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                firebaseAuth.signOut();
                startActivity(new Intent(ViewProfile.this, LoginScreen.class));
            }
        });
        //go to Playlist page
        Playlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ViewProfile.this, Playlist.class));
            }
        });
        //go to MainActivity page
        Home.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ViewProfile.this, MainActivity.class));
            }
        });

        checkLoginStatus();
    }

    AccessTokenTracker tokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
            if(currentAccessToken == null){
                txtName.setText("");
                txtEmail.setText("");
                circleImageView.setImageResource(0);
            }
            else{
                loaduserProfile(currentAccessToken);
            }
        }
    };

    //get Facebook profile data
    private void loaduserProfile(AccessToken newAccessToken){
        GraphRequest request = GraphRequest.newMeRequest(newAccessToken, new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                    String first_name = object.getString("first_name");
                    String last_name = object.getString("last_name");
                    String email = object.getString("email");
                    String id = object.getString("id");
                    String image_url = "https://graph.facebook.com/"+id+ "/picture?type=normal";

                    txtEmail.setText(email);
                    txtName.setText(first_name +" "+last_name);
                    RequestOptions requestOptions = new RequestOptions();
                    requestOptions.dontAnimate();

                    Glide.with(ViewProfile.this).load(image_url).into(circleImageView);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "first_name, last_name, email, id");
        request.setParameters(parameters);
        request.executeAsync();
    }

    //display Facebook profile data if already logged in
    private void checkLoginStatus(){
        if(AccessToken.getCurrentAccessToken()!= null){
            loaduserProfile(AccessToken.getCurrentAccessToken());
        }
    }
}

我的 Facebook 登录页面


package com.example.musix.Musix;

import android.app.ProgressDialog;
import android.content.Intent;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.musix.MainActivity;
import com.example.musix.R;
import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphRequestAsyncTask;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Arrays;

public class LoginScreen extends AppCompatActivity {

    private EditText Username;
    private EditText Password;
    private Button Login;
    private LoginButton FacebookLogin;
    private ImageView circleImageView;
    private TextView txtName,txtEmail;
    private TextView userRegistration;
    private FirebaseAuth firebaseAuth;
    private ProgressDialog progressDialog;
    private TextView forgotPassword;

    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_screen);

        Username = (EditText) findViewById(R.id.etName);
        Password = (EditText) findViewById(R.id.etPassword);
        Login = (Button) findViewById(R.id.btnLogin);
        FacebookLogin = (LoginButton) findViewById(R.id.facebookLogin);
        txtName = findViewById(R.id.profile_name);
        txtEmail = findViewById(R.id.profile_email);
        circleImageView = (ImageView) findViewById(R.id.profile_icon);
        userRegistration = (TextView)findViewById(R.id.tvRegister);
        forgotPassword = (TextView)findViewById(R.id.tvForgotPassword);

        firebaseAuth = FirebaseAuth.getInstance();
        progressDialog = new ProgressDialog(this);

        FirebaseUser user = firebaseAuth.getCurrentUser();
        if(user != null){
            finish();
            startActivity(new Intent(LoginScreen.this, MainActivity.class));
        }

        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (((Username.length() > 0) && (Password.length() > 0)) ||(AccessToken.getCurrentAccessToken()!= null)){
                    validate(Username.getText().toString(), Password.getText().toString());
                }
                else if((Username.length() == 0) && (Password.length() > 0)){
                    Username.setError("Enter Username");
                }
                else if((Password.length() == 0) && (Username.length() > 0)){
                    Password.setError("Enter Password");
                }
                else{
                    Username.setError("Enter Username");
                    Password.setError("Enter Password");
                }
            }
        });
        userRegistration.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginScreen.this, SignUp.class));
            }
        });

        callbackManager = CallbackManager.Factory.create();
        FacebookLogin.setReadPermissions(Arrays.asList("email", "public_profile"));
        checkLoginStatus();

        FacebookLogin.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                final AccessToken accessToken = loginResult.getAccessToken();
                GraphRequestAsyncTask request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject user, GraphResponse graphResponse) {
                        LoginManager.getInstance().logOut();
                    }
                }).executeAsync();


                Toast.makeText(getApplicationContext(), "Login Success with Facebook", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(LoginScreen.this, MainActivity.class));

            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException error) {
                Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_SHORT).show();
            }
        });

        forgotPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginScreen.this, ForgotPassword.class));
            }
        });
    }

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

    AccessTokenTracker tokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
            if(currentAccessToken == null){
                txtName.setText("");
                txtEmail.setText("");
                circleImageView.setImageResource(0);
            }
            else{
                loaduserProfile(currentAccessToken);
            }
        }
    };

    //get Facebook profile data
    private void loaduserProfile(AccessToken newAccessToken){
        GraphRequest request = GraphRequest.newMeRequest(newAccessToken, new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                    String first_name = object.getString("first_name");
                    String last_name = object.getString("last_name");
                    String email = object.getString("email");
                    String id = object.getString("id");
                    String image_url = "https://graph.facebook.com/"+id+ "/picture?type=normal";

                    txtEmail.setText(email);
                    txtName.setText(first_name +" "+last_name);
                    RequestOptions requestOptions = new RequestOptions();
                    requestOptions.dontAnimate();

                    Glide.with(LoginScreen.this).load(image_url).into(circleImageView);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "first_name, last_name, email, id");
        request.setParameters(parameters);
        request.executeAsync();
    }

    //display Facebook profile data if already logged in
    private void checkLoginStatus(){
        if(AccessToken.getCurrentAccessToken()!= null){
            loaduserProfile(AccessToken.getCurrentAccessToken());
        }
    }

    private void validate(String userUsername, String userPassword){
        //show login progress
        progressDialog.setMessage("Loading . . .");
        progressDialog.show();

        //Login admin account
        if((userUsername.equals("Admin")) && (userPassword.equals("12345"))){
            Intent intent = new Intent(LoginScreen.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
        //Login using firebase-registered accounts
        else{
            firebaseAuth.signInWithEmailAndPassword(userUsername,userPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    if(task.isComplete()){
                        progressDialog.dismiss();
                        Toast.makeText(LoginScreen.this, "Login Successful", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(LoginScreen.this, MainActivity.class));
                    }

                    else{
                        progressDialog.dismiss();
                        Toast.makeText(LoginScreen.this, "The username or password you entered is incorrect.", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
}

最佳答案

@Override
                public void onCompleted(JSONObject user, GraphResponse graphResponse) {
                    LoginManager.getInstance().logOut();
                }
            }).executeAsync();

成功登录后,您将自行退​​出。删除

LoginManager.getInstance().logOut();

关于java - Facebook 登录 加载用户资料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319333/

相关文章:

java - Tomcat JDBC Conencton Pool + MySQL 给出 "Broken pipe"问题,即使有连接验证

java - Android keystore 已损坏

c# - 使用 Facebook C# SDK 获取 friend 的事件太慢

facebook - 将应用程序宽度设置更改为 810px 没有任何效果

ios - 如何在 iOS 8 上 Touch ID 失败时回退到密码验证?

java - C++ 代码中的 JNI 全局静态变量

java - DCEVM java 补丁不起作用

ruby-on-rails - 使用 'registered' 属性渲染 Facebook 好友

python - 需要一个 python 身份验证/授权框架

python - Django:我可以重定向点击/admin/的未经身份验证的用户吗