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 가 또나옴 . 근데 또 기억못함
[안드로이드 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

'✍2021,2022 > app(android studio)' 카테고리의 다른 글
앱만들기.39(Fragment 간 데이터 전송) (0) | 2021.08.18 |
---|---|
앱만들기.38(Table Layout) (0) | 2021.08.18 |
앱만들기.36(Check Box) (0) | 2021.08.16 |
앱만들기.35(Radio Button) (0) | 2021.08.15 |
앱만들기. 40 (android studio Github연동으로 협업하는 방법) (0) | 2021.08.12 |
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 가 또나옴 . 근데 또 기억못함
[안드로이드 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

'✍2021,2022 > app(android studio)' 카테고리의 다른 글
앱만들기.39(Fragment 간 데이터 전송) (0) | 2021.08.18 |
---|---|
앱만들기.38(Table Layout) (0) | 2021.08.18 |
앱만들기.36(Check Box) (0) | 2021.08.16 |
앱만들기.35(Radio Button) (0) | 2021.08.15 |
앱만들기. 40 (android studio Github연동으로 협업하는 방법) (0) | 2021.08.12 |