当我通过 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/