可快速選擇預設兩個使用者作登入
(當然你也可以自己在firebase console新增帳戶)
登入後主畫面下方會顯示目前的使用者
也可以利用主畫面右上方logout登出,重新回到登入畫面
整個流程如下圖所示:
這樣流程的好處是,當下次啟動程式時,若上次使用已有登入,即可直接進入MainActivity主畫面,不需作重新登入的動作!
有了這個身分認證的步驟,後面的應用就相當多了
可根據不同登入的使用者,結合firebase後端作不同的應用(如套用各自偏好設定,顯示個別紀錄等等)
另外firebase也提供了許多身分認證的方式:自建電子郵件帳密、Google帳戶、Facebook、Twitter、Github、匿名登入...
這個範例將會使用「自建電子郵件帳密」作身分認證,在使用上也會比較有彈性
直接看程式碼吧!解說的部份我直接放在程式碼註解部份~
> AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.pingtung.ccstudio.notepadcloud"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity"></activity> </application> </manifest>
> activity_login.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_login" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.pingtung.ccstudio.notepadcloud.LoginActivity"> <TextView android:text="Email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/textView" android:textSize="24sp" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textEmailAddress" android:text="email" android:ems="10" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/etMail" /> <TextView android:text="Password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/etMail" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/textView2" android:textSize="24sp" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:text="password" android:ems="10" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/etPwd" /> <Button android:text="Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="103dp" android:id="@+id/btnLogin" /> <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/btnLogin" android:layout_centerHorizontal="true" android:layout_marginBottom="18dp" android:id="@+id/radioGroup"> <RadioButton android:text="User1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/rbUser1" /> <RadioButton android:text="Test1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/rbTest1"/> </RadioGroup> </RelativeLayout>
> LoginActivity.java
package com.pingtung.ccstudio.notepadcloud; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; 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.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class LoginActivity extends AppCompatActivity { //UI variables private EditText etMail; private EditText etPwd; private Button btnLogin; private RadioGroup radioGroup; private RadioButton rbUser1, rbTest1; //Firebase instance variables private FirebaseAuth auth; private FirebaseUser user; private FirebaseAuth.AuthStateListener authListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); etMail = (EditText)findViewById(R.id.etMail); etPwd = (EditText)findViewById(R.id.etPwd); btnLogin = (Button)findViewById(R.id.btnLogin); radioGroup = (RadioGroup)findViewById(R.id.radioGroup); rbUser1 = (RadioButton)findViewById(R.id.rbUser1); rbTest1 = (RadioButton)findViewById(R.id.rbTest1); //取得auth實體(只有一個實體app內皆能共用) auth = FirebaseAuth.getInstance(); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String email = etMail.getText().toString(); String password = etPwd.getText().toString(); //使用email, password作登入 auth.signInWithEmailAndPassword(email,password) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if(task.isSuccessful()) { //登入成功 Log.d("android", "signInWithEmail:onComplete:" + task.isSuccessful()); } else { //登入失敗 Log.w("android", "signInWithEmail:failed", task.getException()); Toast.makeText(LoginActivity.this, "請檢查登入帳密是否正確輸入", Toast.LENGTH_SHORT).show(); } } }); } }); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int checkedId) { switch(checkedId){ case R.id.rbUser1: etMail.setText("user1@example.com"); etPwd.setText("abc123"); break; case R.id.rbTest1: etMail.setText("test1@example.com"); etPwd.setText("xyz123"); break; } } }); rbUser1.setChecked(true); //宣告auth狀態變更的監聽器 authListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { user = firebaseAuth.getCurrentUser(); if (user!=null) { Log.d("android", "已登入: UserUid="+user.getUid()); startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); }else{ Log.d("android", "已登出"); } } }; } @Override protected void onStart() { super.onStart(); //加入auth監聽器 auth.addAuthStateListener(authListener); } @Override protected void onStop() { super.onStop(); //移除auth監聽器 auth.removeAuthStateListener(authListener); } }
> activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.pingtung.ccstudio.notepadcloud.MainActivity"> <TextView android:text="LoginUser:" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/textView6" android:textSize="18sp" android:textColor="@android:color/black" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="UserName" android:id="@+id/tvUser" android:textSize="18sp" android:layout_marginLeft="17dp" android:layout_marginStart="17dp" android:layout_alignParentBottom="true" android:layout_toRightOf="@+id/textView6" android:layout_toEndOf="@+id/textView6" android:textColor="@android:color/holo_red_light" /> </RelativeLayout>
> MainActivity.java
package com.pingtung.ccstudio.notepadcloud; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class MainActivity extends AppCompatActivity { //UI variables private TextView tvUser; //Firebase instance variables private FirebaseAuth auth; private FirebaseUser user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //find UId tvUser = (TextView)findViewById(R.id.tvUser); //取得auth實體(只有一個實體app內皆能共用) auth = FirebaseAuth.getInstance(); user = auth.getCurrentUser(); //若無登入帳戶,則getCurrentUser()傳回null //開啟LoginActivity if(user==null){ startActivity(new Intent(this,LoginActivity.class)); finish(); }else{ tvUser.setText(user.getEmail()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main,menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.logout: //將auth登出 auth.signOut(); startActivity(new Intent(this,LoginActivity.class)); finish(); break; } return super.onOptionsItemSelected(item); } }
> menu_main.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:apps="http://schemas.android.com/apk/res-auto"> <item android:title="logout" android:id="@+id/logout" apps:showAsAction="never"></item> </menu>
> 完整程式碼(Github)
沒有留言:
張貼留言