web analytics

Android Code : ทำ Google Plus login ตอนที่ 2

cover-1

จากบทความก่อนเราทำการตั้งค่าทุกอย่างไว้แล้ว บทความนี้เราจะมา coding กัน

 

บทความก่อนหน้านี้

Android Code : ทำ Google Plus login ตอนที่ 1

 

เริ่มต้น

เพิ่มบรรทัดนี้ใน build.gradle ของระดับโปรเจค

      classpath 'com.google.gms:google-services:3.0.0'

 

1-3

 

ไปที่ build.gradle ของ app ให้เพิ่ม บรรทัดข้างล่างนี้

apply plugin: 'com.google.gms.google-services'
..
..
dependencies{
      ..
      compile 'com.google.android.gms:play-services-auth:9.0.0'
}

2

 

แล้วกด sync ทีนึง

 

เขียน layout ให้มีปุ่ม sign in (ใช้ปุ่มธรรมดา ก็ได้)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.google.android.gms.common.SignInButton
        android:id="@+id/sign_in_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:buttonSize="wide"
        android:layout_centerInParent="true"/>
</RelativeLayout>

3

 

ต่อมาก็มา เขียนใน Java ให้ findViewById ของปุ่มล็อคอินให้เรียบร้อย

public class MainActivity extends AppCompatActivity {

    SignInButton btnSignIn;

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

        btnSignIn = (SignInButton) findViewById(R.id.sign_in_button);
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn();
            }
        });
    }

    private void signIn() {
        // do something when click button.
    }
}

 

เสร็จแล้วมา ต่อเติมส่วน GoogleApiClient

public class MainActivity extends AppCompatActivity {

    GoogleApiClient mGoogleApiClient;
    Button btnSignIn;

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

        btnSignIn = (Button) findViewById(R.id.sign_in_button);
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn();
            }
        });

        initInstance();
    }

    private void signIn() {
        // do something when click button.
    }
    
    private void initInstance() {
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, null)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
    }
}

 

มาเขียนส่วนของการ sign in เมื่อผู้ใช้กดปุ่ม
เริ่มจาก ประกาศตัวแปร request code ก่อน เป็น global variable โดยค่าของมันก็เหมือนเป็นค่าที่ระบุว่ามาจาก request ไหน ตอนผลลัพธ์กลับมา จะใช้คู่กับ startActivityForResult

    private final int GOOGLE_LOGIN_REQUEST_CODE = 1010;

    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, GOOGLE_LOGIN_REQUEST_CODE);
    }

 

หลังจากที่ startActivityForResult ถูกเรียก มันก็จะไปทำงานตาม intent ในที่นี้คือ signIntent และมันจะส่งผลลัพธ์กลับมา โดยจะกลับมาที่ method ชื่อว่า onActivityResult พร้อมแนบ request code มาด้วย เราก็ทำการเช็ค request code ก่อนว่าใช่ของเรามัย ถ้าใช่จึงทำงานต่อ

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == GOOGLE_LOGIN_REQUEST_CODE) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
    }

    private void handleSignInResult(GoogleSignInResult result) {
        if (result.isSuccess()) {  // Signed in successfully, show authenticated UI.
            GoogleSignInAccount acct = result.getSignInAccount(); // get data from account.
            // acct.getDisplayName();
            onLoginComplete(true);
        } 
        else {  // Signed out, show unauthenticated UI.
            onLoginComplete(false);
        }
    }
    
    private void onLoginComplete(boolean success){
        // do something.
    }

 

เพื่อให้เห็นภาพ จะแก้ code ให้มี dialog ขึ้นมาแสดงข้อมูลนิดหน่อย

    private void handleSignInResult(GoogleSignInResult result) {
        if (result.isSuccess()) {  // Signed in successfully, show authenticated UI.
            GoogleSignInAccount acct = result.getSignInAccount(); // get data from account.
            // acct.getDisplayName();
            onLoginComplete(true, acct);
        } else {  // Signed out, show unauthenticated UI.
            onLoginComplete(false, null);
        }
    }

    private void onLoginComplete(boolean success, GoogleSignInAccount acct) {
        if (success) {
            String message = "\nID    = " + acct.getId()
                            +"\nName  = " + acct.getDisplayName()
                            +"\nEmail = " + acct.getEmail();
            showDialog(message);
        }else{
            showDialog("ERROR");
        }
    }

    private void showDialog(String msg) {
        AlertDialog.Builder builder =
                new AlertDialog.Builder(MainActivity.this);
        builder.setMessage(msg);
        builder.show();
    }

 

ผลลัพธ์

a2

 

ลองเอาไปใช้งานกันดูครับ

(:

 

 

Reference

https://developers.google.com/+/mobile/android/getting-started
https://developers.google.com/android/guides/client-auth
https://developers.google.com/identity/sign-in/android/start-integrating