Android Auth(3-2)Facebook整合-程式設定

這一篇是上一篇的續篇,如還沒有看過上一篇,請參考

Android Auth(3-1)Facebook整合-設定專案

再來繼續。

先來看一下畫面:

f335.png

畫面上只有兩個 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
        }
    }
};

 

登入畫面:
f336f337

 

並在Firebase 控制台看到登入帳號,就表示成功了!

f338
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);
    }
}

 

發表留言