這一篇是上一篇的續篇,如還沒有看過上一篇,請參考
Android Auth(3-1)Facebook整合-設定專案
再來繼續。
先來看一下畫面:
畫面上只有兩個 View ,上面那個是 Facebook LoginButton 用來登入登出 Facebook,下面則是一個普通的 TextView,在 Layout 檔中,這兩個物件是
<com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" />
程式的部份第一件要做的事情是初始化 Facebook SDK,要在 onCreate 這個方法中加入
FacebookSdk.sdkInitialize(getApplicationContext()); AppEventsLogger.activateApp(this);
接下來要處理 login button 的回傳事件,先要設定取得權限,並在回傳成功時,登入 Firebase。 登入 Firebase 需要 FirebaseAuth 的實體,並用Facebook 回傳的 Access Token 來產生憑證(credential)用做登入。另外處理Facebook Intent 回傳的訊息時,需要一個 CallbackManager 物件來處理 。
所以先新增兩個屬性:
CallbackManager callbackManager; private FirebaseAuth mAuth;
然後在 onCreate 加上相關的設定,在成功登入Facebook 的 方法中,取得Access Token 並使用該 Token 產生憑證登入 Facebook,成功的話就在訊息欄取得登入者的顯示名稱
message =(TextView)findViewById(R.id.message); //訊息欄 loginButton = (LoginButton)findViewById(R.id.login_button); loginButton.setReadPermissions("email", "public_profile"); //設定權限 callbackManager = CallbackManager.Factory.create(); mAuth = FirebaseAuth.getInstance(); // 登入回傳資訊處理 loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { //成功登入 Facebook 時的處理 AccessToken token = loginResult.getAccessToken(); AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); mAuth.signInWithCredential(credential) .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull com.google.android.gms.tasks.Task<AuthResult> task) { if (task.isSuccessful()) { // 成功登入顯示使用者訊 FirebaseUser user = mAuth.getCurrentUser(); message.setText(user.getDisplayName()); } else { // 登入失敗顯示 Toast.makeText(MainActivity.this, "登入失", Toast.LENGTH_SHORT).show(); } } }); } @Override public void onCancel() { // App code 取消登入時的處理 } @Override public void onError(FacebookException exception) { // App code 登入錯誤時的處理 } });
但是現在Facebook Intent 回傳時,是回傳給 MainActivity,所以要加上回傳轉送的方法
// Instent 回傳資訊處理 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { callbackManager.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); }
其實做到這兒,己經可以登入了,但我們還沒有處理登出的部份。登出的部份不是在 login 的 Intent 回傳的,他無法得到登出的資訊, 但我們可以由監聽Access Token 是否存在來抓取登出時機,要監聽 Access Token 我們要建立 AccessTokenTracker 物件,並在 AccessTokenChanged 方法中,若發現 Token 是空的,就代表登出了。
請在 onCreate 最後加上這一段,就可以處理登出了
// Facebook 登出監聽 Profile fbProfile = Profile.getCurrentProfile(); AccessTokenTracker accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) { if (currentAccessToken == null) { mAuth.signOut(); message.setText("請登入"); //deleteContact();//This is my code } } };
登入畫面:
並在Firebase 控制台看到登入帳號,就表示成功了!
MainActivity.java
public class MainActivity extends AppCompatActivity { LoginButton loginButton; TextView message; CallbackManager callbackManager; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FacebookSdk.sdkInitialize(getApplicationContext()); AppEventsLogger.activateApp(this); message =(TextView)findViewById(R.id.message); //訊息欄 loginButton = (LoginButton)findViewById(R.id.login_button); loginButton.setReadPermissions("email", "public_profile"); //設定權限 callbackManager = CallbackManager.Factory.create(); mAuth = FirebaseAuth.getInstance(); // 登入回傳資訊處理 loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { //成功登入 Facebook 時的處理 AccessToken token = loginResult.getAccessToken(); AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); mAuth.signInWithCredential(credential) .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull com.google.android.gms.tasks.Task<AuthResult> task) { if (task.isSuccessful()) { // 成功登入顯示使用者訊 FirebaseUser user = mAuth.getCurrentUser(); message.setText(user.getDisplayName()); } else { // 登入失敗顯示 Toast.makeText(MainActivity.this, "登入失", Toast.LENGTH_SHORT).show(); } } }); } @Override public void onCancel() { // App code 取消登入時的處理 } @Override public void onError(FacebookException exception) { // App code 登入錯誤時的處理 } }); // Facebook 登出監聽 Profile fbProfile = Profile.getCurrentProfile(); AccessTokenTracker accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) { if (currentAccessToken == null) { mAuth.signOut(); message.setText("請登入"); //deleteContact();//This is my code } } }; } // Instent 回傳資訊處理 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { callbackManager.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } }