촬리의늘솔길

앱만들기.37(Google Login) 본문

✍~2022/app(android studio)

앱만들기.37(Google Login)

리촬리 2021. 8. 18. 01:49

1. 일단 파이어베이스 콘솔로 가줌

2. 프로젝트 만들어줌

3. 패키지 넣어주기 ( 근데 매니페스트말고 mainjava에도 있눈디?)

4. gradle 에서 SHA키 찾아서 입력

- 터미널에 gradlew signingReport 입력해주기

- 컴퓨터에 맞는 해시키같은거임

5. google-service.json 다운

6. app폴더에 복붙

7. 안내에 나오는대로 따라하기

예시

 

8.

여기서 구글연동함

 

9. 추가해주기 (gradle.app)에

 

implementation 'com.google.firebase:firebase-analytics:19.0.0'//파이어 베이스 분석을 도와주는
implementation 'com.google.firebase:firebase-core:19.0.0' //파이어베이스 코어
implementation 'com.google.firebase:firebase-auth:21.0.1' //파이어베이스 인증1
implementation 'com.firebaseui:firebase-ui-auth:4.2.1' //파이어베이스 인증2
implementation 'com.github.bumptech.glide:glide:4.12.0'//프로필을 온전하게 이미지뷰에 글라이드 이미지 로딩
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' //글라이드 이미지 로딩

 

 

여기서,

※ Glide 란?

안드로이드에서 지원하는 라이브러리로 이미지를 효율적으로 불러올 수 있게 도와준다.

 

10. 

com.google.android.gms.common.SignInButton

을 xml에 추가해준다.

파이어베이스 관련 로직들 때문에 사용가능한 상태가 됨

 

 

11. xml design 조정해주고, 

추가 액티비티 만들어서 로그인 result xml 만들기

 

12. 

 

 

main java에 있는 임포트들이 gradle에 선언하지 않았다면 불러와지지않는다고..

 

 


 

Context란?

애플리케이션 환경에 대한 인터페이스 이자, 추상 클래스 이다. 즉, 애플리케이션의 현재 상태 를 뜻한다. Context를 통해 애플리케이션에 접근할 수 있고, 애플리케이션 수준 작업을 호출할 수 있다.

Application Context :

getApplicationContext()를 통해 액티비티 내에서 접근 가능한 인스턴스

애플리케이션 라이프사이클 과 연결되어 있으며 현재 Context와 분리된 Context가 필요한 경우 사용한다.

Activity Context:

액티비티 라이프사이클 과 연결되어 있으며 액티비티 수준의 Context가 필요한 경우 사용한다.

Toast 메시지를 띄우는 것과 같은 UI 작업 시

 

액티비티는 자신의 Context 와 애플리케이션 Context를 모두 가지고 있으며 getContext() 혹은 this를 사용할 경우 액티비티 Context 가 return된다.

 

 

 

 

안드로이드에서는 Context 라는 인스턴스화된 매개체를 통해야만 유사한 일들을 수행할 수 있습니다.

This 는?

C# 의 경우 System 단에서 제공하는 정적 함수(static function)를 호출 함으로서 간단하게 할 수 있는 일들을 안드로이드에서는 Context 에 정의된 인스턴스 함수를 호출해야만 가능하게 되어있습니다. 즉, 위에서 처럼 반드시 인스턴스화된 Context 클래스(여기서는 this) 를 사용해야 되는 셈이지요. 

Context 는 언제 태어날까?

 

Context 는 어플리케이션이 시작될 때는 물론이요, 어플리케이션 컴포넌트들이 생성될때마다 태어나는 셈입니다. 물론, 새롭게 생성되는 Context 들이 부모와 완전히 독립되어 있는 존재는 아니고 '거의' 비슷한 내용을 담고 있습니다

 


StartActivity 가 또나옴 . 근데 또 기억못함

https://jhshjs.tistory.com/49

 

[안드로이드 Activity] startActivityForResult 사용법 및 startActivity와 차이점

Android 개발 Tip. - Activity Start Method 액티비티 실행시 값 전달 방법 startActivityForResult VS StartActivity 일반적으로 Activity를 띄울 때는 startActivity()를 사용한다. 다른 방법으로는 startActivi..

jhshjs.tistory.com

https://kiwinam.com/posts/23/android-start-activity-for-result/

 

[안드로이드] startActivityForResult ,onActivityResult 사용법 :: 키위남

[안드로이드] startActivityForResult ,onActivityResult 사용법 안드로이드 개발을 진행하다 보면 단순히 액티비티를 전환하고 끝! 이 아니라 후속 액티비티에서 작업한 결과물을 호출한 액티비티에서 사

kiwinam.com

 

 

Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);

 

와ntent intent = new Intent(getApplicationContext(), ResultActivity.class);
의 차이점은 멀까

 

 


ResultActivity.java

package com.example.googleloginexample;

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_result);

        //main에서 putextra해주면 받는구문
        Intent intent = getIntent();
        String NickName = intent.getStringExtra("NickName"); //MainActivity로부터 닉네임 전달받음
        String PhotoUrl = intent.getStringExtra("PhotoUrl"); //MainActivity로부터 프로필 전달받음


        tv_result =findViewById(R.id.tv_result);
        tv_result.setText(NickName); //얻어온친구를 셋 해줌, 닉네임 테스트를 텍스트뷰에 세팅


        iv_profile = findViewById(R.id.iv_profile);
        //oncreate안에서는 this
        Glide.with(this).load(PhotoUrl).into(iv_profile);//프로필 url을 이미지뷰에 세팅
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ResultActivity">

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="닉네임"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_profile" />

    <ImageView
        android:id="@+id/iv_profile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

</androidx.constraintlayout.widget.ConstraintLayout>

Main.java

package com.example.googleloginexample;

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.ImageView;
import android.widget.TextView;
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 MainActivity 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);


        //new 는 생성자
        //구글 사인 버튼 이용할때 옵션세팅
        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 v) {
                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(MainActivity.this, "로그인 성공", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
                            //Intent PutExtra라는 행위 자체가 ResultActivity쪽으로 값들을 넘기려고 하는것이라고함.
                            intent.putExtra("NickName", account.getDisplayName()); //닉네임 가져올 수 있음, 키값을 정해줌 ""이걸로
                            intent.putExtra("PhotoUrl", String.valueOf(account.getPhotoUrl()));
                            //Intent PutExtra할때는 Uri라는 객체를 넣을수가 없는데 이게 Uri라는 객체라서 스트링으로 변환해야
                            //String valueOf 특정 자료형을 String형태로 변환시키는


                            startActivity(intent);
                        } else {//로그인실패했으면
                            Toast.makeText(MainActivity.this, "로그인 실패", Toast.LENGTH_SHORT).show();
                            //실패한원인을 추가하고싶으면 앱에맞게 로직추가
                        }
                    }
                });
    }


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

    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <com.google.android.gms.common.SignInButton
        android:id="@+id/btn_google"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

gradle duplicate 오류떠서

gradle properties에 추가해줌

android.enableJetifier=true 

 

728x90