Firebase Android Codelab - 친근한 채팅 구축

1. 개요

스크린샷

이미지: Working Friendly Chat 앱.

친절한 채팅 코드랩에 오신 것을 환영합니다. 이 코드랩에서는 Firebase 플랫폼을 사용하여 Android에서 채팅 앱을 만드는 방법을 배웁니다.

배울 내용

  • Firebase 인증을 사용하여 사용자 로그인을 허용하는 방법입니다.
  • Firebase 실시간 데이터베이스를 사용하여 데이터를 동기화하는 방법입니다.
  • Firebase용 Cloud Storage에 바이너리 파일을 저장하는 방법입니다.
  • Firebase 로컬 에뮬레이터 제품군을 사용하여 Firebase로 Android 앱을 개발하는 방법입니다.

필요한 것

2. 샘플 코드 받기

저장소 복제

명령줄에서 GitHub 리포지토리를 복제합니다.

$ git clone https://github.com/firebase/codelab-friendlychat-android

Android 스튜디오로 가져오기

안드로이드 스튜디오, 파일> 열기에서, 다음 선택 build-android-start (디렉토리 android_studio_folder ) 샘플 코드를 다운로드한 디렉토리에서.

이제이 있어야 build-android-start 안드로이드 스튜디오에서 열린 프로젝트를. 당신이에 대한 경고가 표시되면 google-services.json 없는 파일을 걱정하지 않습니다. 이후 단계에서 추가됩니다.

종속성 확인

이 Codelab에는 필요한 모든 종속성이 이미 추가되어 있지만 Firebase SDK를 앱에 추가하는 방법을 이해하는 것이 중요합니다.

build.gradle

buildscript {
    // ...

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.2'

        // The google-services plugin is required to parse the google-services.json file
        classpath 'com.google.gms:google-services:4.3.5'
    }
}

앱/빌드.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.gms.google-services'
}

android {
    // ...
}

dependencies {
    // ...

    // Google Sign In SDK
    implementation 'com.google.android.gms:play-services-auth:19.0.0'

    // Firebase SDK
    implementation platform('com.google.firebase:firebase-bom:26.6.0')
    implementation 'com.google.firebase:firebase-database-ktx'
    implementation 'com.google.firebase:firebase-storage-ktx'
    implementation 'com.google.firebase:firebase-auth-ktx'

    // Firebase UI Library
    implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    implementation 'com.firebaseui:firebase-ui-database:7.2.0'
}

3. Firebase CLI 설치

실행하기 위해 중포 기지 에뮬레이터 스위트 , 당신은 설치하고 사용할 필요가 중포 기지 CLI를 .

CLI 설치

옵션 1 - npm으로 설치

머신에 이미 Node.js 및 npm이 설치되어 있는 경우 다음 명령을 사용하여 CLI를 설치할 수 있습니다.

npm install -g firebase-tools@latest

옵션 2 - 독립 실행형 바이너리 설치

당신은 Node.js를 / 고궁 박물원가 없거나 앱 개발에 새로해서, 당신은 다음과 같은 독립형 바이너리와 CLI 설치할 수 있습니다 여기에 해당 플랫폼에 대한 지침 .

설치 확인

당신이 중포 기지 CLI가 설치되면, 당신이 버전이 있는지 확인하려면 다음 명령을 실행 9.11.0 이상 :

firebase --version

4. Firebase 에뮬레이터 제품군에 연결

에뮬레이터 시작

터미널에서 로컬의 루트에서 다음 명령을 실행 codelab-friendlychat-android 디렉토리 :

firebase emulators:start --project=demo-friendlychat-android

다음과 같은 로그가 표시되어야 합니다. 포트 값은 정의 된 firebase.json 복제 된 샘플 코드에 포함 된 파일.

$ firebase emulators:start --project=demo-friendlychat-android
i  emulators: Starting emulators: auth, database, storage
i  emulators: Detected demo project ID "demo-friendlychat-android", emulated services will use a demo configuration and attempts to access non-emulated services for this project will fail.
i  database: Database Emulator logging to database-debug.log
i  ui: Emulator UI logging to ui-debug.log

┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
│ i  View Emulator UI at http://localhost:4000                │
└─────────────────────────────────────────────────────────────┘

┌────────────────┬────────────────┬────────────────────────────────┐
│ Emulator       │ Host:Port      │ View in Emulator UI            │
├────────────────┼────────────────┼────────────────────────────────┤
│ Authentication │ localhost:9099 │ http://localhost:4000/auth     │
├────────────────┼────────────────┼────────────────────────────────┤
│ Database       │ localhost:9000 │ http://localhost:4000/database │
├────────────────┼────────────────┼────────────────────────────────┤
│ Storage        │ localhost:9199 │ http://localhost:4000/storage  │
└────────────────┴────────────────┴────────────────────────────────┘
  Emulator Hub running at localhost:4400
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

에 이동 에 http : // localhost를 : 4000 중포 기지 에뮬레이터 스위트 UI를 볼 수있는 웹 브라우저 :

에뮬레이터 제품군 UI 홈

휴가 emulators:start 코드 랩의 나머지 부분에 대한 명령 실행.

앱 연결

안드로이드 스튜디오에서 열린 MainActivity.kt , 그 내부에 다음 코드를 추가 onCreate 방법 :

// When running in debug mode, connect to the Firebase Emulator Suite.
// "10.0.2.2" is a special IP address which allows the Android Emulator
// to connect to "localhost" on the host computer. The port values (9xxx)
// must match the values defined in the firebase.json file.
if (BuildConfig.DEBUG) {
    Firebase.database.useEmulator("10.0.2.2", 9000)
    Firebase.auth.useEmulator("10.0.2.2", 9099)
    Firebase.storage.useEmulator("10.0.2.2", 9199)
}

5. 스타터 앱 실행

google-services.json 추가

중포 기지에 연결할 수있는 안드로이드 응용 프로그램 위해서는, 당신은 추가해야합니다 google-services.json 내부 파일을 app 안드로이드 프로젝트의 폴더. 이 코드랩의 목적을 위해 Firebase 에뮬레이터 제품군에 연결할 수 있는 모의 JSON 파일을 제공했습니다.

복사 mock-google-services.json 에 파일을 build-android-start/app 과 같은 폴더 google-services.json :

cp mock-google-services.json build-android-start/app/google-services.json

이 코드랩의 마지막 단계에서는 실제 Firebase 프로젝트와 Firebase Android 앱을 생성하여 이 모의 JSON 파일을 고유한 구성으로 교체하는 방법을 알아봅니다.

앱 실행

프로젝트를 Android Studio로 가져오고 Firebase 구성 JSON 파일을 추가했으므로 이제 앱을 처음 실행할 준비가 되었습니다.

  1. Android 에뮬레이터를 시작합니다.
  2. 안드로이드 스튜디오에서 실행을 (클릭실행하다 ) 도구 모음에서.

앱은 Android 에뮬레이터에서 실행되어야 합니다. 이 시점에서 빈 메시지 목록이 표시되어야 하며 메시지 보내기 및 받기가 작동하지 않습니다. 이 코드랩의 다음 단계에서는 사용자가 친숙한 채팅을 사용할 수 있도록 인증합니다.

6. 인증 활성화

이 앱은 Firebase 실시간 데이터베이스를 사용하여 모든 채팅 메시지를 저장합니다. 하지만 데이터를 추가하기 전에 앱이 안전하고 인증된 사용자만 메시지를 게시할 수 있는지 확인해야 합니다. 이 단계에서는 Firebase 인증을 활성화하고 실시간 데이터베이스 보안 규칙을 구성합니다.

기본 로그인 기능 추가

다음으로 몇 가지 기본 Firebase 인증 코드를 앱에 추가하여 사용자를 감지하고 로그인 화면을 구현합니다.

현재 사용자 확인

먼저에 다음 인스턴스 변수를 추가 MainActivity.kt 클래스 :

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

이제 수정할 수 MainActivity 그들이 응용 프로그램을 열고 인증되지 않은 때마다 로그인 화면에 사용자를 보낼 수 있습니다. 받는 다음을 추가 onCreate() 애프터 방법 binding 뷰에 부착된다 :

MainActivity.kt

// Initialize Firebase Auth and check if the user is signed in
auth = Firebase.auth
if (auth.currentUser == null) {
    // Not signed in, launch the Sign In activity
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
    return
}

우리는 또한 사용자가 동안 로그인되어 있는지 확인하려면 onStart() :

MainActivity.kt

public override fun onStart() {
    super.onStart()
    // Check if user is signed in.
    if (auth.currentUser == null) {
        // Not signed in, launch the Sign In activity
        startActivity(Intent(this, SignInActivity::class.java))
        finish()
        return
    }
}

그런 다음 구현 getUserPhotoUrl()getUserName() 현재 인증 된 중포 기지 사용자에 대한 적절한 정보를 반환하는 방법 :

MainActivity.kt

private fun getPhotoUrl(): String? {
    val user = auth.currentUser
    return user?.photoUrl?.toString()
}

private fun getUserName(): String? {
    val user = auth.currentUser
    return if (user != null) {
        user.displayName
    } else ANONYMOUS
}

그런 다음 구현 signOut() 버튼을 밖으로 기호를 처리하는 방법 :

MainActivity.kt

private fun signOut() {
    AuthUI.getInstance().signOut()
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
}

이제 필요할 때 사용자를 로그인 화면으로 보내는 모든 논리가 준비되었습니다. 다음으로 사용자를 적절하게 인증하기 위해 로그인 화면을 구현해야 합니다.

로그인 화면 구현

파일 열기 SignInActivity.kt . 여기에서 간단한 로그인 버튼을 사용하여 인증을 시작합니다. 이 섹션에서는 FirebaseUI를 사용하여 로그인 로직을 구현합니다.

에서 인증 인스턴스 변수를 추가 SignInActivity 언더 클래스 // Firebase instance variables 코멘트 :

로그인 활동.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

그런 다음, 편집 onCreate() 메서드는에서와 같은 방법으로 중포 기지를 초기화 MainActivity :

로그인 활동.kt

// Initialize FirebaseAuth
auth = Firebase.auth

추가 ActivityResultLauncher 에 필드를 SignInActivity :

로그인 활동.kt

// ADD THIS
private val signIn: ActivityResultLauncher<Intent> =
        registerForActivityResult(FirebaseAuthUIActivityResultContract(), this::onSignInResult)

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
}

다음, 편집 onStart() 흐름에 FirebaseUI 기호 킥오프 방법 :

로그인 활동.kt

public override fun onStart() {
    super.onStart()

    // If there is no signed in user, launch FirebaseUI
    // Otherwise head to MainActivity
    if (Firebase.auth.currentUser == null) {
        // Sign in with FirebaseUI, see docs for more details:
        // https://firebase.google.com/docs/auth/android/firebaseui
        val signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setLogo(R.mipmap.ic_launcher)
                .setAvailableProviders(listOf(
                        AuthUI.IdpConfig.EmailBuilder().build(),
                        AuthUI.IdpConfig.GoogleBuilder().build(),
                ))
                .build()

        signIn.launch(signInIntent)
    } else {
        goToMainActivity()
    }
}

다음으로, 구현 onSignInResult 결과의 기호를 처리하는 방법을. 로그인 절차의 결과가 성공하면 계속 MainActivity :

로그인 활동.kt

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    if (result.resultCode == RESULT_OK) {
        Log.d(TAG, "Sign in successful!")
        goToMainActivity()
    } else {
        Toast.makeText(
                this,
                "There was an error signing in",
                Toast.LENGTH_LONG).show()

        val response = result.idpResponse
        if (response == null) {
            Log.w(TAG, "Sign in canceled")
        } else {
            Log.w(TAG, "Sign in error", response.error)
        }
    }
}

그게 다야! 서버 측 구성을 관리할 필요 없이 몇 번의 메서드 호출만으로 FirebaseUI를 사용한 인증을 구현했습니다.

작업 테스트

Android Emulator에서 앱을 실행합니다. 즉시 로그인 화면으로 이동해야 합니다. 다음 계정을 생성, 이메일 버튼에 로그인을 누릅니다. 모든 것이 올바르게 구현되면 메시징 화면으로 전송되어야 합니다.

로그인 한 후, 다음, 브라우저에서 중포 기지 에뮬레이터 스위트 UI를 열고이 첫 번째 로그인 한 사용자 계정을 확인하기 위해 인증 탭을 클릭합니다.

7. 메시지 읽기

이 단계에서는 실시간 데이터베이스에 저장된 메시지를 읽고 표시하는 기능을 추가합니다.

샘플 메시지 가져오기

  1. 중포 기지 에뮬레이터 스위트 UI에서 실시간 데이터베이스 탭을 선택합니다.
  2. 드래그 앤 드롭 initial_messages.json 데이터 뷰어로 코드 랩 저장소의 로컬 복사본에서 파일을.

이제 아래에 몇 가지 메시지가 있어야 messages 데이터베이스의 노드를.

데이터 읽기

메시지 동기화

이 섹션에서는 새로 추가된 메시지를 앱 UI에 동기화하는 코드를 다음과 같이 추가합니다.

  • Firebase 실시간 데이터베이스를 초기화하고 데이터 변경 사항을 처리하기 위해 리스너를 추가합니다.
  • 업데이트하기 RecyclerView 새 메시지가 표시 될 수 있도록 어댑터를.
  • 에서 다른 중포 기지 인스턴스 변수와 데이터베이스 인스턴스 변수를 추가 MainActivity 클래스를 :

MainActivity.kt

// Firebase instance variables
// ...
private lateinit var db: FirebaseDatabase
private lateinit var adapter: FriendlyMessageAdapter

당신의 MainActivity의 수정 onCreate() 주석 아래 방법 // Initialize Realtime Database and FirebaseRecyclerAdapter 아래에 정의 된 코드를. 이 코드는 실시간 데이터베이스에서 기존의 모든 메시지를 추가 한 다음 아래에 새 자식 항목을 수신 messages 당신의 중포 기지 실시간 데이터베이스의 경로. 각 메시지의 UI에 새 요소를 추가합니다.

MainActivity.kt

// Initialize Realtime Database
db = Firebase.database
val messagesRef = db.reference.child(MESSAGES_CHILD)

// The FirebaseRecyclerAdapter class and options come from the FirebaseUI library
// See: https://github.com/firebase/FirebaseUI-Android
val options = FirebaseRecyclerOptions.Builder<FriendlyMessage>()
    .setQuery(messagesRef, FriendlyMessage::class.java)
    .build()
adapter = FriendlyMessageAdapter(options, getUserName())
binding.progressBar.visibility = ProgressBar.INVISIBLE
manager = LinearLayoutManager(this)
manager.stackFromEnd = true
binding.messageRecyclerView.layoutManager = manager
binding.messageRecyclerView.adapter = adapter

// Scroll down when a new message arrives
// See MyScrollToBottomObserver for details
adapter.registerAdapterDataObserver(
    MyScrollToBottomObserver(binding.messageRecyclerView, adapter, manager)
)

다음에 FriendlyMessageAdapter.kt Class 구성 구현 bind() 내부 클래스 내의 메소드 MessageViewHolder() :

프렌들리메시지어댑터.kt

inner class MessageViewHolder(private val binding: MessageBinding) : ViewHolder(binding.root) {
    fun bind(item: FriendlyMessage) {
        binding.messageTextView.text = item.text
        setTextColor(item.name, binding.messageTextView)

        binding.messengerTextView.text = if (item.name == null) ANONYMOUS else item.name
        if (item.photoUrl != null) {
            loadImageIntoView(binding.messengerImageView, item.photoUrl!!)
        } else {
            binding.messengerImageView.setImageResource(R.drawable.ic_account_circle_black_36dp)
        }
    }
    ...
}

우리는 또한 또한 구현 이미지입니다 디스플레이 메시지에 필요한 bind() 내부 클래스 내에서 방법 ImageMessageViewHolder() :

프렌들리메시지어댑터.kt

inner class ImageMessageViewHolder(private val binding: ImageMessageBinding) :
    ViewHolder(binding.root) {
    fun bind(item: FriendlyMessage) {
        loadImageIntoView(binding.messageImageView, item.imageUrl!!)

        binding.messengerTextView.text = if (item.name == null) ANONYMOUS else item.name
        if (item.photoUrl != null) {
            loadImageIntoView(binding.messengerImageView, item.photoUrl!!)
        } else {
            binding.messengerImageView.setImageResource(R.drawable.ic_account_circle_black_36dp)
        }
    }
}

마지막으로, 다시 MainActivity , 시작 및 정지 중포 기지 실시간 데이터베이스에서 업데이트를 듣고. 업데이트 onPause()onResume() 메소드 MainActivity 아래와 같이 :

MainActivity.kt

public override fun onPause() {
    adapter.stopListening()
    super.onPause()
}

public override fun onResume() {
    super.onResume()
    adapter.startListening()
}

메시지 동기화 테스트

  1. (실행을 클릭합니다실행하다 ).
  2. 에뮬레이터 스위트 UI에서 수동으로 다음, 실시간 데이터베이스 탭으로 돌아가 새 메시지를 추가 할 수 있습니다. Android 앱에 메시지가 표시되는지 확인합니다.

축하합니다. 앱에 실시간 데이터베이스를 추가했습니다!

8. 메시지 보내기

문자 메시지 전송 구현

이 섹션에서는 앱 사용자가 문자 메시지를 보낼 수 있는 기능을 추가합니다. 보내기 버튼을 클릭 이벤트를 수신 아래의 코드는, 새로운 생성 FriendlyMessage 메시지 필드의 내용으로 개체를 데이터베이스에 메시지를 푸시합니다. push() 메소드는 객체의 가압 경로 자동 생성 된 ID를 추가한다. 이러한 ID는 새 메시지가 목록 끝에 추가되도록 하는 순차적입니다.

에서 전송 버튼을 클릭 리스너 업데이트 onCreate() 의 방법 MainActivity 클래스를. 이 코드는의 하단에 onCreate() 이미 방법. 업데이트 onClick() 아래의 코드를 일치하도록 몸을 :

MainActivity.kt

// Disable the send button when there's no text in the input field
// See MyButtonObserver for details
binding.messageEditText.addTextChangedListener(MyButtonObserver(binding.sendButton))

// When the send button is clicked, send a text message
binding.sendButton.setOnClickListener {
    val friendlyMessage = FriendlyMessage(
        binding.messageEditText.text.toString(),
        getUserName(),
        getPhotoUrl(),
        null /* no image */
    )
    db.reference.child(MESSAGES_CHILD).push().setValue(friendlyMessage)
    binding.messageEditText.setText("")
}

이미지 메시지 전송 구현

이 섹션에서는 앱 사용자가 이미지 메시지를 보낼 수 있는 기능을 추가합니다. 이미지 메시지 생성은 다음 단계에 따라 수행됩니다.

  • 이미지 선택
  • 이미지 선택 처리
  • 실시간 데이터베이스에 임시 이미지 메시지 쓰기
  • 선택한 이미지 업로드 시작
  • 업로드가 완료되면 이미지 메시지 URL을 업로드된 이미지의 URL로 업데이트합니다.

이미지 선택

이 코드랩은 이미지를 추가하기 위해 Firebase용 Cloud Storage를 사용합니다. Cloud Storage는 앱의 바이너리 데이터를 저장하기에 좋은 장소입니다.

이미지 선택 처리 및 임시 메시지 작성

사용자가 이미지를 선택한 후, 화상 선택 Intent 시작된다. 이것은 이미 끝에 코드 구현 onCreate() 메소드. 완료되면 그것은 호출 MainActivityonImageSelected() 메소드를. 아래 코드 조각을 사용하여 이미지가 업로드되고 있음을 나타내는 임시 이미지 URL이 포함된 메시지를 데이터베이스에 작성합니다.

MainActivity.kt

private fun onImageSelected(uri: Uri) {
    Log.d(TAG, "Uri: $uri")
    val user = auth.currentUser
    val tempMessage = FriendlyMessage(null, getUserName(), getPhotoUrl(), LOADING_IMAGE_URL)
    db.reference
            .child(MESSAGES_CHILD)
            .push()
            .setValue(
                    tempMessage,
                    DatabaseReference.CompletionListener { databaseError, databaseReference ->
                        if (databaseError != null) {
                            Log.w(
                                    TAG, "Unable to write message to database.",
                                    databaseError.toException()
                            )
                            return@CompletionListener
                        }

                        // Build a StorageReference and then upload the file
                        val key = databaseReference.key
                        val storageReference = Firebase.storage
                                .getReference(user!!.uid)
                                .child(key!!)
                                .child(uri.lastPathSegment!!)
                        putImageInStorage(storageReference, uri, key)
                    })
}

이미지 업로드 및 메시지 업데이트

방법 추가 putImageInStorage()MainActivity . 호출됩니다 onImageSelected() 선택한 이미지의 업로드를 시작합니다. 업로드가 완료되면 적절한 이미지를 사용하도록 메시지를 업데이트합니다.

MainActivity.kt

private fun putImageInStorage(storageReference: StorageReference, uri: Uri, key: String?) {
    // First upload the image to Cloud Storage
    storageReference.putFile(uri)
        .addOnSuccessListener(
            this
        ) { taskSnapshot -> // After the image loads, get a public downloadUrl for the image
            // and add it to the message.
            taskSnapshot.metadata!!.reference!!.downloadUrl
                .addOnSuccessListener { uri ->
                    val friendlyMessage =
                        FriendlyMessage(null, getUserName(), getPhotoUrl(), uri.toString())
                    db.reference
                        .child(MESSAGES_CHILD)
                        .child(key!!)
                        .setValue(friendlyMessage)
                }
        }
        .addOnFailureListener(this) { e ->
            Log.w(
                TAG,
                "Image upload task was unsuccessful.",
                e
            )
        }
}

메시지 전송 테스트

  1. Android 스튜디오에서실행하다 실행 버튼을 클릭합니다.
  2. Android Emulator에서 메시지를 입력한 다음 보내기 버튼을 탭합니다. 새 메시지는 앱 UI와 Firebase Emulator Suite UI에 표시되어야 합니다.
  3. Android Emulator에서 "+" 이미지를 탭하여 기기에서 이미지를 선택합니다. 새 메시지는 먼저 자리 표시자 이미지와 함께 표시되어야 하고 이미지 업로드가 완료되면 선택한 이미지와 함께 표시되어야 합니다. 새 메시지는 Emulator Suite UI에서도 볼 수 있어야 합니다. 특히 Realtime Database 탭에서는 개체로, Storage 탭에서는 blob으로 표시되어야 합니다.

9. 축하합니다!

Firebase를 사용하여 실시간 채팅 애플리케이션을 구축했습니다!

배운 것

  • Firebase 인증
  • Firebase 실시간 데이터베이스
  • Firebase용 클라우드 스토리지

다음으로 이 코드랩에서 배운 내용을 사용하여 자신의 Android 앱에 Firebase를 추가해 보세요. 더 중포 기지에 대한 자세한 내용은 방문 firebase.google.com을 .

당신이 진짜 중포 기지 프로젝트를 설정하고 (대신 데모 프로젝트 에뮬레이트 자원) 실제 중포 기지 리소스를 사용하는 방법을 배우고 싶다면, 다음 단계를 계속합니다.

참고 : 당신이 진짜 중포 기지 프로젝트를 설정하고 실제 응용 프로그램을 구축 시작 때 특히, 우리는 개발 및 테스트를 위해 중포 기지 지역 에뮬레이터 스위트를 사용하는 것이 좋습니다 후에도.

10. 선택 사항: Firebase 프로젝트 생성 및 설정

이 단계에서는 실제 Firebase 프로젝트와 이 Codelab과 함께 사용할 Firebase Android 앱을 만듭니다. 또한 앱에 특정 Firebase 구성을 추가합니다. 마지막으로 앱에서 사용할 실제 Firebase 리소스를 설정합니다.

Firebase 프로젝트 만들기

  1. 귀하의 브라우저에서 이동 중포 기지 콘솔 .
  2. 선택 추가 프로젝트.
  3. 프로젝트 이름을 선택하거나 입력합니다. 원하는 이름을 사용할 수 있습니다.
  4. 이 코드랩에는 Google 애널리틱스가 필요하지 않으므로 프로젝트에서 사용 설정을 건너뛸 수 있습니다.
  5. 프로젝트 만들기를 클릭합니다. 프로젝트가 준비되면, Continue (계속)를 클릭합니다.

Android 프로젝트에 Firebase 추가

이 단계를 시작하기 전에 앱의 SHA1 해시를 가져옵니다. 해당 지역에서 다음 명령을 실행하여 build-android-start 디버그 키의 SHA1을 결정하기 위해 디렉토리 :

./gradlew signingReport

Store: /Users/<username>/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A5:88:41:04:8F:06:59:6A:AE:33:76:87:AA:AD:19:23
SHA1: A7:89:F5:06:A8:07:A1:22:EC:90:6A:A6:EA:C3:D4:8B:3A:30:AB:18
SHA-256: 05:A2:2A:35:EE:F2:51:23:72:4D:72:67:A5:6A:8A:58:22:2C:00:A6:AB:F6:45:D5:A1:82:D8:90:A4:69:C8:FE
Valid until: Wednesday, August 10, 2044

위와 같은 출력이 표시되어야 합니다. 중요한 줄은입니다 SHA1 해시. 당신이 당신의 SHA1 해시를 찾을 수없는 경우, 볼 이 페이지를 자세한 내용은.

Firebase 콘솔로 돌아가서 다음 단계에 따라 Firebase 프로젝트에 Android 프로젝트를 등록합니다.

  1. 새 프로젝트의 개요 화면에서 Android 아이콘을 클릭하여 설정 워크플로를 시작합니다.안드로이드 앱 추가
  2. 다음 화면에서 입력 com.google.firebase.codelab.friendlychat 앱 패키지 이름으로.
  3. 등록 앱은 다음 중포 기지 구성 파일을 다운로드 다운로드 구글 - services.json을 클릭하십시오.
  4. 복사 google-services.json 에 파일을 app 안드로이드 프로젝트의 디렉토리.
  5. (그들은 이미 당신을 위해 수행했던 콘솔의 설정 작업 흐름에 표시된 다음 단계를 건너 뛰기 build-android-start 프로젝트).
  6. 프로젝트를 Gradle 파일과 동기화하여 앱에서 모든 종속성을 사용할 수 있는지 확인하세요. 안드로이드 스튜디오 도구 모음에서 파일> Gradle을 파일과 동기화 프로젝트를 선택합니다.

Firebase 인증 구성

앱이 사용자를 대신하여 Firebase 인증 API에 액세스하려면 먼저 Firebase 인증과 앱에서 사용할 로그인 제공자를 활성화해야 합니다.

  1. 에서 중포 기지 콘솔 , 왼쪽 탐색 패널에서 인증을 선택합니다.
  2. 로그인-의 방법 탭을 선택합니다.
  3. 다음 활성화 (파란색)에 토글 스위치, 이메일 / 비밀번호를 클릭합니다.
  4. 다음 활성화 (파란색)에 토글 스위치, 구글을 클릭하고 프로젝트 지원 이메일을 설정합니다.

나중에 이 코드랩에서 "CONFIGURATION_NOT_FOUND" 메시지와 함께 오류가 발생하면 이 단계로 돌아와 작업을 다시 확인하세요.

실시간 데이터베이스 구성

이 Codelab의 앱은 Firebase 실시간 데이터베이스에 채팅 메시지를 저장합니다. 이 섹션에서는 Firebase 보안 규칙이라는 JSON 구성 언어를 통해 데이터베이스를 만들고 보안을 구성합니다.

  1. 에서 중포 기지 콘솔 , 왼쪽 탐색 패널에서 실시간 데이터베이스를 선택합니다.
  2. 클릭 새로운 실시간 데이터베이스 인스턴스를 만들 수있는 데이터베이스를 만듭니다. 메시지가 표시되면 선택 us-central1 지역을, 다음을 클릭합니다.
  3. 보안 규칙에 대한 메시지가 표시되면 잠금 모드를 선택한 다음 사용을 클릭합니다.
  4. : 데이터베이스 인스턴스가 생성되면, 다음과 규칙 구성 업데이트 규칙 탭을 선택
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

보안 규칙 작업 (이하 "인증"변수에 대한 문서를 포함한다)하는 방법에 대한 자세한 내용은 참조 실시간 데이터베이스 보안 문서를 작성 .

Firebase용 Cloud Storage 구성

  1. 에서 중포 기지 콘솔 , 왼쪽 탐색 패널에서 저장을 선택합니다.
  2. 프로젝트의 클라우드 스토리지를 사용하려면 시작하기를 클릭합니다.
  3. 대화 상자의 단계에 따라 제안된 기본값을 사용하여 버킷을 설정합니다.

Firebase 리소스에 연결

이 코드 랩의 이전 단계에서는에 다음 추가 MainActivity.kt . 이 조건부 블록은 Android 프로젝트를 Firebase 에뮬레이터 제품군에 연결했습니다.

// REMOVE OR DISABLE THIS
if (BuildConfig.DEBUG) {
    Firebase.database.useEmulator("10.0.2.2", 9000)
    Firebase.auth.useEmulator("10.0.2.2", 9099)
    Firebase.storage.useEmulator("10.0.2.2", 9199)
}

당신의 새로운 실제 중포 기지 프로젝트와 실제 중포 기지 자원에 응용 프로그램을 연결하려는 경우, 당신도이 블록을 제거하거나 너무 릴리스 모드에서 응용 프로그램을 실행할 수 있습니다 BuildConfig.DEBUG 있다 false .