android

안드로이드 스튜디오 구글 로그인(2)

Daekyue 2023. 1. 3. 12:04
빌드 - Authentication에서 로그인 방식을 설정할 수 있다
여기서 구글을 선택하고 사용설정 후 프로젝트 지원 이메일에는 현재 로그인 되어 있는 자신의 구글아이디를 입력한다
implementation 'com.google.firebase:firebase-core:21.1.1' // 파이어베이스 코어 추가
implementation 'com.google.firebase:firebase-auth:21.0.8' // 파이어베이스 인증 추가
//
implementation 'com.firebase:firebase-ui-auth:4.2.1'    // 파이어베이스 인증2
//이 부분 오류발생시 
//implementation 'com.google.firebase:firebase-auth' 이렇게 수정

implementation 'com.github.bumptech.glide:glide:4.11.0'         // 글라이드 이미지 로딩
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' // 글라이드 이미지 로딩2

// 다음 코드들을 build.gradle(:app)에 넣고 Sync Now 해준다

다음은 res - layout-activity_main에서

<com.google.android.gms.common.SignInButton
        android:id="@+id/btn_google"
        android:layout_width="200dp"
        android:layout_height="wrap_content"/>
// 구글 로그인 버튼을 추가해준다
 
로그인이 성공한 후 보여줄 Activity를 하나 더 생성한다
상세설정은 다음과 같이 설정하였다

LoginActivity 코드입니다.

package com.akj.a0924;

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

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
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.FirebaseAuth;
import com.google.firebase.auth.GoogleAuthProvider;

public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {

    private SignInButton btn_google;    // 구글 로그인 버튼
    private FirebaseAuth auth;          // 파이어 베이스 인증 객체
    private GoogleApiClient googleApiClient;    // 구글 API 클라이언트 객체
    private static final int REQ_SIGN_GOOGLE = 100; // 구글 로그인 결과 코드

    @Override
    protected void onCreate(Bundle savedInstanceState) {    // 앱이 실행될때 처음 수행되는 곳
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        googleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this,this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
                .build();

        auth = FirebaseAuth.getInstance();  // 파이어베이스 인증 객체 초기화

        btn_google = findViewById(R.id.btn_google);
        btn_google.setOnClickListener(new View.OnClickListener() {  // 구글 로그인 버튼을 클릭했을 때 여기서 수행
            @Override
            public void onClick(View view) {
                Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);  // 구글에서 제공하는 액티비티 연결
                startActivityForResult(intent, REQ_SIGN_GOOGLE);        // 구글에서 제공하는 액티비티에서 제공하는 결과값을 받아옴

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {   // 구글 로그인 인증을 요청 했을 때 결과 값을 되돌려 받는 곳
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == REQ_SIGN_GOOGLE) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if(result.isSuccess())
            {
                GoogleSignInAccount account = result.getSignInAccount();    // account라는 데이터는 구글 로그인 정보를 담고있다. ( 닉네임, 프로필사진, 이메일주소...등)
                resultLogin(account);   // 로그인 결과 값 출력 수행하라는 메소드
            }
        }
    }

    private void resultLogin(GoogleSignInAccount account) {
        AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(),null);
        auth.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();
                            Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
                            intent.putExtra("nickName", account.getDisplayName());
                            intent.putExtra("photoUrl",String.valueOf(account.getPhotoUrl()));  // String.valueOf() 특정 자료형을 String 형태로 변환할때
                            startActivity(intent);
                        }else{  // 로그인에 실패했으면
                            Toast.makeText(LoginActivity.this, "로그인 실패", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}
 

ResultActivity 코드입니다

package com.akj.a0924;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

public class ResultActivity extends AppCompatActivity {

    private TextView tv_result;
    private ImageView iv_profile;

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


        Intent intent = getIntent();
        String nickName = intent.getStringExtra("nickName");    // MainActivity로부터 닉네임 전달받음
        String photoUrl = intent.getStringExtra("photoUrl");    // MainActivity로부터 프로필 Url 전달받음

        tv_result = findViewById(R.id.tv_result);
        tv_result.setText(nickName);        // 닉네임 textview에 세팅


        iv_profile = findViewById(R.id.iv_profile);
        Glide.with(this).load(photoUrl).into(iv_profile);   // 프로필 url을 이미지뷰에 세팅
    }
}
 
첫화면
로그인 후 화면

+++++++++수정

실행할 때 빌드 오류 날 경우

build.gradle(Module)

implementation 'com.google.firebase:firebase-core:21.1.1' // 파이어베이스 코어 추가
implementation 'com.google.firebase:firebase-auth:21.0.8' // 파이어베이스 인증 추가
implementation 'com.firebase:firebase-ui-auth:4.2.1'    // 파이어베이스 인증2

// 다음 코드들을 build.gradle(:app)에 넣고 Sync Now 해준다
// 오류발생시 위 코드 아래꺼로 수정

implementation 'com.google.firebase:firebase-core:21.1.1' // 파이어베이스 코어 추가
implementation 'com.google.firebase:firebase-auth:21.0.8' // 파이어베이스 인증 추가
implementation 'com.google.firebase:firebase-auth'