2022年4月16日 星期六

android studio:google和帳號facebook帳號登入-2 帳號登入和註冊頁面程式

(一)login_activity.xml

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

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.facebookloggin.util.ToastUtil;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.FacebookSdk;
import com.facebook.appevents.AppEventsLogger;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class LoginActivity extends AppCompatActivity {
private EditText editemail,editpassword;
private Button btnlogin,btnregister;
private ProgressDialog progressDialog;
private FirebaseAuth mAuth;
private GoogleSignInClient mGoogleSignInClient;
private LoginButton btnFacebook;
private SignInButton btngoogle;
private CallbackManager mCallbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//宣告變數,連結login的視圖元件
editemail=findViewById(R.id.email);
editpassword=findViewById(R.id.password);
btnlogin=findViewById(R.id.login);
btnregister=findViewById(R.id.register);
btngoogle=findViewById(R.id.btn_google);
btnFacebook=findViewById(R.id.btn_facebook);


//進度條實體化
progressDialog =new ProgressDialog(LoginActivity.this);
progressDialog.setTitle("loading");
progressDialog.setMessage("連接中");
progressDialog.setCancelable(false);

//監聽註冊按鍵是否按下
btnregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getApplicationContext(),RegisterActivity.class));
}
});

//監聽「登入」按鍷是否按下
btnlogin.setOnClickListener(view -> {
//判斷資料是否有輸入,再請進行login的方程式
if(editemail.getText().length()>0 && editpassword.getText().length()>0){
login(editemail.getText().toString(),editpassword.getText().toString());
}else{
//ToastUtil.showMsg(LoginActivity.this,"資料有誤,請重新輸入");
Toast.makeText(getApplicationContext(), "資料有誤,請重新輸入", Toast.LENGTH_SHORT).show();
}
});



// 將 Firebase Auth實體化
mAuth = FirebaseAuth.getInstance();

//facebook實體化
// FacebookSdk.sdkInitialize(getApplicationContext()); 新版本已自動初始化
AppEventsLogger.activateApp(getApplication());
mCallbackManager = CallbackManager.Factory.create();
btnFacebook.setPermissions("email","public_profile"); //原setreadpermissions,改成setPermissions
btnFacebook.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d("Facebook", "臉書登入成功:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}

@Override
public void onCancel() {
Log.d("Facabook", "臉書登入失敗");

}

@Override
public void onError(FacebookException error) {
Log.d("Facabok", "facebook:onError", error);
}
});


// 實體化 Google Sign In
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();

mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

//監聽google帳號按鍷是否按下
btngoogle.setOnClickListener(view -> {
ToastUtil.showMsg(LoginActivity.this,"流程一");
//Toast.makeText(LoginActivity.this, "流程一", Toast.LENGTH_SHORT).show();
GoogleSignIn();
});

}//oncreat結尾

//facebook登入後處理程式
private void handleFacebookAccessToken(AccessToken token){
Log.d("臉書", "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("臉書", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
reload();
} else {
// If sign in fails, display a message to the user.
Log.w("臉書", "signInWithCredential:failure", task.getException());
Toast.makeText(LoginActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
reload();
}
}
});

}

// google登入的方程式
public void login(String email,String password){
progressDialog.show();
mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful() && task.getResult()!=null){
if(task.getResult().getUser()!=null){
reload();
}else{

}//if取得使用者不為空結束
Toast.makeText(getApplicationContext(),"註冊成功",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),"註冊失敗",Toast.LENGTH_LONG).show();
}//if task成功結束
progressDialog.dismiss();
}
});//signInWithEmailAndPassword結束

}


//利用google帳號登入流程一
private void GoogleSignIn () {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
Toast.makeText(LoginActivity.this, "流程二", Toast.LENGTH_SHORT).show();
startActivityForResult(signInIntent, 1001);
}

@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(LoginActivity.this, "流程三", Toast.LENGTH_SHORT).show();
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == 1001) {
Toast.makeText(LoginActivity.this, "流程四", Toast.LENGTH_SHORT).show();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
Toast.makeText(LoginActivity.this, "流程五,登入成功", Toast.LENGTH_SHORT).show();
Log.d("google登入", "firebaseAuthWithGoogle:" + account.getId());
firebaseAuthWithGoogle(account.getIdToken());
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w("google登入", "Google sign in failed", e);
}
}//google 登入1001結束
if(requestCode==1002){
Toast.makeText(LoginActivity.this, "流程七", Toast.LENGTH_SHORT).show();
// Pass the activity result back to the Facebook SDK
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
Toast.makeText(LoginActivity.this, "流程八", Toast.LENGTH_SHORT).show();
}

private void firebaseAuthWithGoogle(String idToken) {
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Toast.makeText(LoginActivity.this, "流程六,登入成功", Toast.LENGTH_SHORT).show();
// Sign in success, update UI with the signed-in user's information
Log.d("google", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
} else {
// If sign in fails, display a message to the user.
Log.w("google", "signInWithCredential:failure", task.getException());
}
reload();
}
});
}

private void updateUI(){
startActivity(new Intent(LoginActivity.this,MainActivity.class));
}


private void reload(){
startActivity(new Intent(getApplicationContext(),MainActivity.class));
}
//reload結束
@Override
public void onStart() {
super.onStart();
// 檢查是否使用者已經登入 and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
if(currentUser != null){
reload();
}
}//onstart結束

}

二.register_activity.xml


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

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

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.FirebaseUser;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.UserProfileChangeRequest;

public class RegisterActivity extends AppCompatActivity {

private EditText editname,editemail,editpassword,editpasswordconf;
private Button btnregister,btnlogin;
private ProgressDialog progressDialog;
private FirebaseAuth mAuth;


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

//宣告變數,連結login的視圖元件
editname=findViewById(R.id.name);
editemail=findViewById(R.id.email);
editpassword=findViewById(R.id.password);
editpasswordconf=findViewById(R.id.passwordconf);
btnlogin=findViewById(R.id.login);
btnregister=findViewById(R.id.register);

progressDialog =new ProgressDialog(RegisterActivity.this);
progressDialog.setTitle("loading");
progressDialog.setMessage("連接中");
progressDialog.setCancelable(false);

// 實體化 Firebase Auth
mAuth = FirebaseAuth.getInstance();


//監聽登入按鈕是否按下
btnlogin.setOnClickListener(view -> {
finish();
});

//監聽註冊按鈕是否按下
btnregister.setOnClickListener(view->{
//判斷是否輸入資料
if(editname.getText().length()>0 && editemail.getText().length()>0 && editpassword.getText().length()>0){
//判斷密碼兩次輸入是否相同
if(editpassword.getText().toString().equals(editpasswordconf.getText().toString())){
//執行register方程式
register(editname.getText().toString().trim(),editemail.getText().toString().trim(),editpassword.getText().toString().trim());

}else{
Toast.makeText(getApplicationContext(), " 密碼兩次輸入不相同", Toast.LENGTH_SHORT).show();
}//判斷密碼兩次輸入是否相同結束

}else{
Toast.makeText(getApplicationContext(), "資料未輪入完全", Toast.LENGTH_SHORT).show();
}//判斷是否輸入資料結束
});

}//oncreat 結束
//此為註冊的方程式
private void register(String name,String email,String password){
progressDialog.show();
//連結使用email及密碼註冊的方法
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful() && task.getResult() !=null){
FirebaseUser firebaseUser =task.getResult().getUser();
if(firebaseUser !=null) {
//將姓名加入使用者資料中
UserProfileChangeRequest request = new UserProfileChangeRequest.Builder()
.setDisplayName(name)
.build();
firebaseUser.updateProfile(request).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
reload();
progressDialog.dismiss();
}
});
}else{
Toast.makeText(getApplicationContext(),"登入失敗",Toast.LENGTH_LONG).show();
}//判斷使用者firebaseuer是否為空結束
}else{
Toast.makeText(getApplicationContext(),task.getException().getLocalizedMessage(),Toast.LENGTH_LONG).show();
}//if結束
progressDialog.dismiss();
}//addOnCompleteListener結束

});//createUserWithEmailAndPassword方法結束

}

private void reload(){
startActivity(new Intent(getApplicationContext(),MainActivity.class));
}
//reload結束
@Override
public void onStart() {
super.onStart();
// 檢查是否使用者已經登入 and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
if(currentUser != null){
reload();
}
}//onstart結束
}

沒有留言:

張貼留言