问题描述
您好,我是Android开发的新手。 我目前正在尝试使用Google的Firebase作为其后端系统来构建基本的android应用程序。
我有一个“使用Facebook登录”按钮,只要单击此按钮,它就会打开一个对话框,用户可以在其中输入他的Facebook凭据来访问该应用程序。 完成后,如果这是他第一次登录,那么我想在Firebase中存储他的电子邮件,姓名和ID;如果不是第一次登录,我想更新他的信息。
我创建了一个名为User(POJO)的类,它将用来表示此数据。 我的问题是我似乎不知道将存储此信息的代码放在何处。 这是我的MainActivity类:
public class MainActivity extends AppCompatActivity {
//Declare our view variables
private LoginButton mLoginButton;
private CallbackManager mCallbackManager;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mDatabase;
private DatabaseReference mDatabaseReference;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
//Initialize callback manager
mCallbackManager = CallbackManager.Factory.create();
//Assign the views to the corresponding variables
mLoginButton = (LoginButton) findViewById(R.id.login_button);
//Assign the button permissions
mLoginButton.setReadPermissions("email", "public_profile");
//Create instance of database
mDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mDatabase.getReference();
//Assign the button a task
mLoginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Log.d(TAG, "facebook:onCancel");
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, "facebook:onError", error);
}
});
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
//Get currently logged in user
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
// Name, email address
String name = user.getDisplayName();
String email = user.getEmail();
// The user's ID, unique to the Firebase project. Do NOT use this value to
// authenticate with your backend server, if you have one. Use
// FirebaseUser.getToken() instead.
String uid = user.getUid();
//Create user
final User loggedIn = new User(uid, name, email);
mDatabaseReference.child("users").child(loggedIn.getId()).setValue(loggedIn);
mDatabaseReference.child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
});
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
}
};
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result back to the Facebook SDK
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
//If user successfully signs in the LoginButton's onSuccess callback method
// get an access token for the signed-in user, exchange it for a Firebase credential
// and authenticate with Firebase using the Firebase credential
private void handleFacebookAccessToken(AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
}
});
}
}
这是我的User类:
public class User {
private String id;
private String name;
private String email;
public User(){
}
public User(String id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
感谢您的时间
1楼
您已经完成了最多的工作,所以我将创建两种方法供您使用。
protected void getUserInfo(final LoginResult login_result){
GraphRequest data_request = GraphRequest.newMeRequest(
login_result.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
try {
String facebook_id = object.getString("id");
String f_name = object.getString("name");
String email_id = object.getString("email");
String token = login_result.getAccessToken().getToken();
String picUrl = "https://graph.facebook.com/me/picture?type=normal&method=GET&access_token="+ token;
saveFacebookCredentialsInFirebase(login_result.getAccessToken());
} catch (JSONException e) {
// TODO Auto-generated catch block
}
}
});
Bundle permission_param = new Bundle();
permission_param.putString("fields", "id,name,email,picture.width(120).height(120)");
data_request.setParameters(permission_param);
data_request.executeAsync();
data_request.executeAsync();
}
在此处将数据保存在Firebase中
private void saveFacebookCredentialsInFirebase(AccessToken accessToken){
AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
Toast.makeText(getApplicationContext(),"Error logging in", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),"Login in Successful", Toast.LENGTH_LONG).show();
}
}
});
}
2楼
我将firebase降级到9.6.0,以避免Google Play服务错误,并且在用户使用handleFacebookAccessToken方法中的凭据登录后保存了该用户。