참고

blog.naver.com/getinthere/221695417720

 

안드로이드 6강 - (1) 서비스

1. 서비스 생명주기2. MP3 플레이어 만들기서비스는 액티비티가 죽어도 명시적으로 죵료하지 않으면 계속...

blog.naver.com

--

 

현재프로젝트

https://github.com/jaybon1/androidwork/tree/master/serviceTest

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

서비스 최초실행시에는 startService(onStartCommand) // 재실행시에는 bindService(onBind) // 종료시에는 unBind

--

 

 

백그라운드 실행, 알림 등

--

 

 

--

 

 

--

 

 

--

 

 

서비스 - 이렇게 생성해야 매니페스트에 등록된다

--

 

 

--

 

 

연습을 위해 함수들에 로그를 입력하자

--

 

 

뷰 세팅

--

 

 

메인액티비티에서 뷰를 연결하고

--

 

 

서비스를 실행해본다

--

 

 

실행해보면 로그에 보인다

--

 

 

서비스엣어 미디어플레이어 레퍼런스 생성 

 

음악을 실행하는 방법 (MyService파일)

 

음악종료시 (MyService파일)

--

 

 

메인액티비티에서 서비스의 레퍼런스를 받을 수 있는 방법이 없다
서비스에서 메인액티비티의 레퍼런스를 받을 수 있는 방법이 없다
서로 제어권이 없다(다른애플리케이션이라고 봐야됨)

---

 

--

 

 

지금 상태는 서비스를 날리는 것이기 때문에 음악 일시정지를 할 수 없다

바인더를 이용해야한다

--

 

 

마샬링

ex) user.java 의 필드가 있다면 직렬화하여 json으로 받아오면된다(메모리를 가져오는 것이아니라 데이터를 가져오는것)
메서드는 문자열로 가져오면 원복이 안된다

이때 마샬링 기법을 사용한다(오브젝트를 들고 오는 것)
서로의 메서드가 동기화 되어있어서 동적인 메서드 사용가능

- MBV(Marshal By Value)

- MBR(Marshal By Reference)

안드로이드에서는 마샬링 대신 AIDL을 사용

https://developer.android.com/guide/components/aidl?hl=ko

 

안드로이드 인터페이스 정의 언어(AIDL)  |  Android 개발자  |  Android Developers

AIDL(Android Interface Definition Language)은 전에 다뤄본 다른 IDL과 유사합니다. 클라이언트와 서비스가 모두 동의한 프로그래밍 인터페이스를 정의하여 프로세스 간 통신(IPC)으로 서로 통신하게 할 수 �

developer.android.com

 클라이언트와 서비스가 모두 동의한 프로그래밍 인터페이스를 정의하여 프로세스 간 통신(IPC)으로 서로 통신하게 할 수 있습니다.

인터페이스를 정의하고 추상메서드를 만든다
그리고 정보만 받아서 바인드하여 사용

메서드를 여러개 만들어도 되지만

메서드 하나만 만들어서 this를 리턴하면 레퍼런스에 접근할 수 있다

--

 

 

 

 

 

 

 

 

 

 

 

 

 

앱 수준 gradle에 글라이드 의존성추가

--

 

 

매니페스트 파일에
인터넷 권한 코드와
ClearTextTraffic 코드를 입력

--

 

 

xml파일에 이미지뷰 세팅

--

 

 

메인액티비티에서 글라이드 코드 입력

--

 

 

테스트 결과

 

 

 

 

 

 

 

 

해당 프로젝트

https://github.com/jaybon1/androidwork/tree/master/mvvmBindingFirestore1

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

뷰모델 구조

 

 

데이터바인딩

 

앱 수준의 gradle에 데이터 바인딩을 허용하는 코드 추가

    // 데이터 바인딩
    dataBinding {
        enabled = true
    }

--

 

 

데이터를 받아올 모델 생성

--

 

 

데이터를 출력할 액티비티를 세팅한다

1. layout으로 바깥을 감싼다
2. 데이터 바인딩을 위해 연결한다
3. 원하는 뷰에 데이터를 연결한다

--

 

바인딩 타입 생성을 위해 리빌드를 해준다

--

 

 

데이터 바인딩을 사용할 클래스에서 데이터바인딩을 한 XML파일의 이름을 파스칼표기법으로 불러보면
아래와 같이 XML파일이름+Binding으로 타입을 불러올 수 있다

1. 데이터바인딩을 위해 변수생성
2. 바인딩 변수를 설정한다 (상위컨텍스트와 mxl레이아웃을 입력한다)
3. 연습용 데이터를 입력한다

--

 

 

테스트
정상적으로 출력된다

--

 

파이어스토어

 

참고

https://ondolroom.tistory.com/745

 

파이어스토어 문서

https://firebase.google.com/docs/firestore/quickstart?authuser=0#%EC%9E%90%EB%B0%94

 

Cloud Firestore 시작하기  |  Firebase

빠른 시작에서는 Cloud Firestore를 설정하고 데이터를 추가한 후 Firebase Console에서 방금 추가한 데이터를 확인하는 방법을 볼 수 있습니다. Cloud Firestore 데이터베이스 만들기 Firebase 프로젝트를 아직

firebase.google.com

 

매니페스트 파일에 인터넷 권한을 설정한다

--

 

 

프로젝트 수준의 gradle에 파이어 스토어 관련 클래스패스를 추가

        // 파이어스토어
        classpath 'com.google.gms:google-services:4.3.3'

--

 

 

앱 수준의 gradle에 파이어스터오 플러그인 추가

// 파이어스토어
apply plugin: 'com.google.gms.google-services'

--

 

 

 

FireStore에 SHA1입력시 사용

--

 

 

프로젝트의 app 안에 fireStore에서 제공한 파일 넣기

--

 

 

파이어스토어에 테스트용 필드 추가

--

 

 

!! 지금 부터 테스트해보는데 오류가 나거나 안된다면 에뮬레이터에서 앱을 지우고 다시 실행해보자

 

 

데이터바인딩 테스트용 코드 주석처리

--

 

 

메인 액티비티에 파이어스토어 레퍼런스 추가

 

onCreate에서 파이어스토어 객체 가져오기(연습)

 

파이어스토어에서 데이터 가져오기 (연습) - 주석처리하자

 

파이어스토어에 빨대꼽기(푸시방식)

https://firebase.google.com/docs/firestore/query-data/listen?authuser=0

 

Cloud Firestore로 실시간 업데이트 가져오기  |  Firebase

onSnapshot() 메서드로 문서를 수신 대기할 수 있습니다. 사용자가 제공하는 콜백이 최초로 호출될 때는 단일 문서의 현재 내용으로 문서 스냅샷이 즉시 생성됩니다. 그런 다음 내용이 변경될 때마�

firebase.google.com

 

앱이 처음 켜질때 1번 실행되고
데이터가 변경 되었을 때 한 번 더 실행되었다

--

 

 

모델에 빈생성자를 만들어주어야 빨대가 작동한다
(아래에 나오는 Name name = snapshot.toObject(Name.class);)

--

 

 

빨대가 꽂아졌다면 해당 이벤트 실행시 데이터바인딩을 연동시켜보자

--

 

 

테스트
실행해보면 fireStore에 저장된 데이터가 화면에 출력된다.
(fireStore에서 데이터를 변경하면 자동으로 변경된다.)

--

 

 

MVVM

 

앱 수준의 gradle에 디펜던시를 추가한다
(뷰모델 프로바이더를 호출하기 위함)

    // LifeCycle
    def lifecycle_version = "2.0.0"
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

 

xml에 글자 입력칸과 버튼을 하나 추가하자

--

 

 

메인액티비티에서 테스트용으로 만들었던 파이어베이스 객체를 주석처리하거나 삭제하자

--

 

 

리파지토리를 생성하고 파이어베이스 객체를 생성하는 코드를 입력

(initPush는 빨대꼽기 가동 함수이다. 아래에서 확인)

--

 

 

1. 라이브데이터를 리턴한다.
2. 이름을 변경하는 함수
3. 파이어스토어 빨대꼽기를 실행하는 함수 (push 가동)

--

 

 

뷰모델에 AndroidViewModel을 상속해주고
LiveData를 리턴해주는 구독()함수
이름을 변경해주는 이름바꾸기()함수를 추가해준다.

--

 

 

1. 첫째줄은 뷰모델 프로바이더 객체에서 뷰모델 인스턴스를 얻는 과정이다
뷰모델 인스턴스를 얻은후 뷰모델의 구독함수를 observe 해놓으면 LiveData의 데이터가 바뀔 때마다 onChanged함수가 실행된다.
2. 버튼을 누르면 뷰모델의 이름바꾸기 함수가 실행된다. (뷰모델엔 빨대가 꽂혀있으니 뷰모델의 이름만 바꿔도 옵저버가 발동하여 onChanged가 실행된다)

--

 

 

테스트

이 화면에서는 보이지 않지만, 다른 기기에서도 새로고침 없이 데이터가 바뀌어버린다

 

 

 

 

해당 프로젝트

https://github.com/jaybon1/androidwork/tree/master/getApiTest

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

인터넷 연결을 위해 AndroidManifest.xml 에 아래코드를 추가해준다

<uses-permission android:name="android.permission.INTERNET"/>

--

 

 

구조

--

 

 

앱 수준의 gradle에 레트로핏과 gson 컨버터를 추가해준다(일반 gson과 다르니 참고)

    // 레트로핏
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'

    // gson
    implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.3.0'

--

 

 

데이터를 가져오기위한 간단한 뷰를 짠다

--

 

 

라이엇 api에서 가져온 데이터를 이용해서  http://www.jsonschema2pojo.org/  사이트를 통해 자바 객체로 만든다

 

변환 사이트

http://www.jsonschema2pojo.org/

 

만들어진 클래스

--

 

 

외부에서 데이터를 가져오기 위한 레트로핏2 서비스

--

 

 

아래처럼 하면 매개변수로 주소값을 설정 할 수 있다

--

 

 

mxl파일의 뷰들을 사용하기 위해 가져온다

--

 

 

1. 레트로핏 객체를 생성한다
- 바뀌지 않는 baseUrl 을 입력
- 가져온 데이터를 자바 객체로 만들기 위한 Gson 컨버터 입력

2. RiotService를 만들어준다
3. RiotService에서 데이터를 가져온다
4. 콜백이 오면 조건에 맟춰서 함수가 실행된다
5. response.body()에 담긴 자바객체를 가져온다 / 텍스트뷰에 뿌려준다
6. 통신에 실패할 경우 메시지를 띄운다

--

 

 

테스트

--

 

 

리얼타임데이터베이스 - 관계형

클라우드파이어스토어 - NoSql

 

 

 

 

 

 

 

 

 

 

 

컬렉션

자바의 컬렉션과 비슷하지만

데이터베이스의 개념으로 생각하면 테이블이라고 생각하면 된다

 

 

 

 

자동ID - 프라이머리키를 안만들어도 자동으로 만들어준다, 속도가 빠르니 사용

자동ID 클릭

 

 

 

 

컬렉션을 문서형태로 넣는다고 보면된다

문서는 각각 다를 수 있다 (필드가 다를 수 있음)
- 제약이 없다 
- 정합성 무결성 보장이 되지 않는다
- 순서 보장이 되지않는다

 

 

 

똑같이 만드는 경우

 

필드를 다른형태로 만드는 경우

 

테스트용으로 총 5개를 넣어보자

 

순서가 보장되지 않기 때문에 createDate 등 날짜로 정렬하거나, 번호를 직접 넣어줘야한다

문서의 ID값을 필드에 넣어줘야 좋다

 

 

포린키

하나의 유저를 팔로우 할 경우, 

 

 

 

 

 

id -  팔로우할 id

 

 

팔로우 할 때 6을 넣는 것이 아니라 컬렉션을 만들어서 팔로우 한 사람들의 문서를 한번 더 적는 것

입력할 때는 번거롭지만 SELECT 할 때는 성능이 좋다

 

검색할 때

/user/6

/user/7/follow

RestApi와 비슷하다

---------

 

컬렉션 삭제

 

 

 

  username: ssar,
  password: 123,
  email: ssar@nate.com,
  phone:0102222,
  address:부산


위에서 받은 데이터를 firebase 메일 가입으로 넣고
Authentication - email , password 

생성된 UID를 포함해서 firebase store에 입력한다

유저 {
  id:1,
  uid: ajsdfjalsdf,
  username: ssar,
  password: 123,
  email: ssar@nate.com,
  phone:0102222,
  address:부산,
  date: 10시
}

 

post{
  id : 1,
  userId : 1,
  title: 제목,
  content: 내용,
  ~~
}

 

 

-----------

 

 

 

 

처음오셨다면 아래링크를 먼저 확인하세요

https://ondolroom.tistory.com/741

 

안드로이드 // firebase로 구글로그인하기

firebase 프로그래머의 필수사항이 되고 있다 push 기술 - 원래는 pull 기술 push 기술은 부하 때문에 잘 만들기 어렵다(while을 클라이언트만큼 돌려야하기 때문에 부하가 크다) firebase는 부하가 적은 pu

ondolroom.tistory.com

 

아래 사이트를 먼저 확인

https://firebase.google.com/docs/auth/android/start?authuser=0

 

Android에서 Firebase 인증 시작하기

Firebase에 앱 연결 Android 프로젝트에 Firebase를 추가하지 않았다면 먼저 추가합니다. 프로젝트 수준 build.gradle 파일의 buildscript 및 allprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다. 앱에 Fir

firebase.google.com

 

--

 

 

AndroidManifest.xml

인터넷 권한 획득을 위해 아래코드 추가

<uses-permission android:name="android.permission.INTERNET"/>

--

 

 

프로젝트 단위 build.gradle

'com.google.gms:google-services:4.3.3' 코드를 추가(3.0.0도 가능)

    dependencies {
        classpath "com.android.tools.build:gradle:4.0.0"
        classpath 'com.google.gms:google-services:4.3.3' // 추가

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

--

 

 

앱 단위 build.gradle

맨 바깥에 아래코드 추가

// firebase
apply plugin: 'com.google.gms.google-services'

dependencies 안에 아래코드 추가

    //firebase create account
    implementation 'com.google.firebase:firebase-auth:19.3.2'

--

 

 

activity_main.xml

아래와 같이 뷰를 짜준다

--

 

 

MainActivity

더보기
package com.jaybon.firebasecreateaccounttest;

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

import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private MainActivity mContext = MainActivity.this;

    private FirebaseAuth mAuth;
    private TextView tv;
    private TextView tv1;
    private EditText email1;
    private EditText password1;
    private Button sign;
    private Button login;
    private Button logout;

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

        // Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();

        tv = findViewById(R.id.tv);
        tv1 = findViewById(R.id.tv1);

        email1 = findViewById(R.id.email);
        password1 = findViewById(R.id.password);

        sign = findViewById(R.id.sign);
        sign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createAccount(email1.getText().toString(), password1.getText().toString());
            }
        });



        login = findViewById(R.id.login);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn(email1.getText().toString(), password1.getText().toString());
            }
        });


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

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
    }

    private void createAccount(String email, String password) {
        Log.d(TAG, "createAccount:" + email);
        if (!validateForm()) {
            return;
        }

        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                Log.d(TAG, "onComplete: 들어옴");
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "createUserWithEmail:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    tv.setText(user.getEmail());
                    tv1.setText("회원가입됨");
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "createUserWithEmail:failure", task.getException());
                    Toast.makeText(mContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void signIn(String email, String password) {
        Log.d(TAG, "signIn:" + email);
        if (!validateForm()) {
            return;
        }

        mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                Log.d(TAG, "onComplete: 들어옴");
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithEmail:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    tv.setText(user.getEmail());
                    tv1.setText("로그인됨");
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithEmail:failure", task.getException());
                    Toast.makeText(mContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void logout() {
        mAuth.signOut();
        Log.d(TAG, "signOut: 사인아웃!!!!!!!!!!!!!"+mAuth.getCurrentUser());
    }

    private boolean validateForm() {
        boolean valid = true;

        String email = email1.getText().toString();
        if (TextUtils.isEmpty(email)) {
            email1.setError("Required.");
            valid = false;
        } else {
            email1.setError(null);
        }

        String password = password1.getText().toString();
        if (TextUtils.isEmpty(password)) {
            password1.setError("Required.");
            valid = false;
        } else {
            password1.setError(null);
        }

        return valid;
    }
}

--

 

입력한 이메일과 비번이 공백인지 확인

--

 

 

회원가입을 진행하는 함수

--

 

 

로그인을 진행하는 함수

--

 

 

로그아웃을 하는 로직

--

 

 

회원가입 테스트

 

 

firebase 프로그래머의 필수사항이 되고 있다

push 기술 -

원래는 pull 기술

push 기술은 부하 때문에 잘 만들기 어렵다(while을 클라이언트만큼 돌려야하기 때문에 부하가 크다)

firebase는 부하가 적은 push기술을 가지고 있다

구글이 서버가 되고 내 앱이 클라이언트

 

Paas - 플랫폼 애즈 어 서비스 (파이어베이스를 통해서 로그인)

트래픽이적으면 돈이 안들고 트래픽이 늘면 돈이 든다

--

프로젝트 생성

--

 

 

firebase로 가서 구글 로그인 하자

--

 

시작하기 클릭

--

 

프로젝트 만들기 클릭

--

 

 

--

 

 

애널리틱스 - 웹에 달아놓으면 사람들이 해당 웹에서 이동한 경로를 분석 할 수 있다

유튜브처럼 사용자가 이용한 내역을 분석 - 사용자 추적

지금 프로젝트에서는 달지 않음.

(추후 자바스크립트에 달아서 테스트 해보기)

--

 

 

--

 

 

ios 안드로이드 웹에 추가 가능

안드로이드 선택

--

 

 

나의 진짜 패키지명을 넣어야 한다

다른 패키지명을 넣었을 경우 google-services.json파일을 수정하여 패키지명을 변경하면 된다

--

 

 

디버그 서명인증서 만들기

안넣으면 안되는게 너무많아서 넣어주자

--

 

 

안드로이드 스튜디오로 가서 오른쪽 Gradle을 눌러 signingReport를 클릭하면

아래와 같이 해시값이 나온다

--

 

위의 디버그 서명인증서에 SHA1 값을 넣어준다

--

 

--

 

다운로드한다

--

 

오른쪽 위 Android를 눌러 Project로 바꾸고 app폴더에 파일을 넣어준다

--

 

프로젝트 단위 빌드 그래들로 이동

아래코드를 dependencies 하위에 넣어준다

        // firebase
        classpath 'com.google.gms:google-services:4.3.3' // 안되면 3.0.0 입력

--

 

앱 단위 빌드 그래들로 이동

 

맨 바깥에 아래 코드를 입력한다

// firebase
apply plugin: 'com.google.gms.google-services'

dependencies 하위에 아래코드를 넣어준다

    //firebase
    implementation 'com.firebaseui:firebase-ui-auth:6.2.0'

--

 

 

콘솔로이동

--

 

문서로 이동

--

 

맨아래 왼쪽 인증버튼클릭

--

 

 

가이드를 확인한다

--

 

 

안드로이드에 firebase추가 하는법 설명 (가이드의 영상 및 설명을 참고하자)

https://firebase.google.com/docs/android/setup?authuser=0

 

Android 프로젝트에 Firebase 추가

기본 요건 Android 스튜디오를 설치하거나 최신 버전으로 업데이트합니다. Android 앱이 다음을 충족하는지 확인합니다. API 수준 16(Jelly Bean) 이상 타겟팅 Gradle 4.1 이상 사용 앱을 실행할 기기 또는 ��

firebase.google.com

--

 

로그인가이드 선택

--

 

 

앱 단위 빌드 그래들로 이동하여 dependencies 하위에 아래 코드를 추가해준다

implementation 'com.firebaseui:firebase-ui-auth:6.2.0'

--

 

 

구글로그인 선택

--

 

테스트할 레이아웃에 SignInButton과 로그아웃 버튼을 추가한다

--

 

메인 액티비티에 아래코드를 참고하여 추가

package com.jaybon.cosapp;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.IdpResponse;
import com.google.android.gms.common.SignInButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";

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

        SignInButton btnGoogleLogin = findViewById(R.id.btn_google_login);
        Button btnGoogleLogout = findViewById(R.id.btn_google_logout);


        btnGoogleLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Choose authentication providers
                List<AuthUI.IdpConfig> providers = Arrays.asList(
                        new AuthUI.IdpConfig.GoogleBuilder().build());

                // 새로운 화면을 띄우는 것 (통신 아님)
                // 띄운후 로그인 하면 통신 (알아서 처리됨)
                startActivityForResult( // 화면이 꺼지면 리턴값을 받는것
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setAvailableProviders(providers)
                                .build(),
                        3648);
            }
        });

        btnGoogleLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                Log.d(TAG, "onClick: 로그아웃" + FirebaseAuth.getInstance().getCurrentUser());
            }
        });
    }

    // 구글 로그인 화면 꺼지면 실행
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 3648) {

            // 응답받은 데이터를 받는다
            // 동시에 오브젝트객체를 메모리에 띄워준다
            // firebaseAuth 힙영역으로 만들어서 사용자의 모든 정보를 담아준다
            IdpResponse response = IdpResponse.fromResultIntent(data);

            if (resultCode == RESULT_OK) {

                // FirebaseAuth 힙영역으로 만들어서 사용자의 모든 정보를 담아준다
                // 세션
                // 스태틱으로 만들어져있음- 모든 액티비티에서 접근가능 (앱은 나혼자 쓰니까)
                // 쉐어드프리퍼런스 안만들려면 이런식으로 만들어야함
                // Successfully signed in 로그인성공
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                // 로그인되었으니 인텐트해서 다른 액티비티로 이동하면 된다.
                Log.d(TAG, "onActivityResult: 로그인완료 : " + user.getEmail());
                Log.d(TAG, "onActivityResult: 로그인완료 : " + FirebaseAuth.getInstance().getCurrentUser());
                Log.d(TAG, "onActivityResult: 로그인완료 : " + response);


            } else {

                Log.d(TAG, "onActivityResult: 실패 : " + response.getError());
            }
        }
    }
}

 

 

메니페스트 파일에 인터넷을 권한 획득을 위한 코드를 넣는다

--

 

실행하여 구글 로그인 해보자

 

--

 

 

--

 

 

로그인해보면 아래 Users에 정보가 확인된다

--

 

 

 

 

 

 

 

 

 

 

세팅완료

----

 

 

 

 

 

 

'App > Android' 카테고리의 다른 글

안드로이드 // firestore 연습  (0) 2020.08.13
안드로이드 // firebase - email 가입 및 로그인  (0) 2020.08.12
안드로이드 // 툴바 헬퍼 공부 참고  (0) 2020.08.06
안드로이드 // MVVM  (0) 2020.08.06
안드로이드 // AAC  (0) 2020.08.06

 

https://github.com/codingspecialist/InstagramClone-Android-Firestore

 

여러액티비티에서 툴바 + 드로어블 사용하려면

헬퍼를 이용해야한다

 

메인

    private void setupBottomNavigationView(){
        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
        BottomNavigationViewHelper.enableNavigation(mContext, bottomNavigationView);
        Menu menu = bottomNavigationView.getMenu();
        MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
        menuItem.setChecked(true);
    }

 

layout_bottom_navigation_view.xml

  
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavigationView"
            android:background="@drawable/white_grey_border_top"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:labelVisibilityMode="unlabeled"
            app:menu="@menu/bottom_navigation_menu">

        </com.google.android.material.bottomnavigation.BottomNavigationView>

    </RelativeLayout>
</merge>

 

 

+ Recent posts