Firebase Android Codelab - Crea chat amichevole

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

1. Panoramica

immagine dello schermo

Immagine: app di chat funzionante.

Benvenuto nel codelab di Friendly Chat. In questo codelab imparerai come utilizzare la piattaforma Firebase per creare un'app di chat su Android.

Cosa imparerai

  • Come utilizzare l'autenticazione Firebase per consentire agli utenti di accedere.
  • Come sincronizzare i dati utilizzando il database in tempo reale di Firebase.
  • Come archiviare file binari in Cloud Storage per Firebase.
  • Come utilizzare Firebase Local Emulator Suite per sviluppare un'app Android con Firebase.

Di cosa avrai bisogno

  • Android Studio versione 4.2+.
  • Un emulatore Android con Android 5.0+.
  • Node.js versione 10 o successiva (per utilizzare Emulator Suite).
  • Java 8 o superiore. Per installare Java utilizzare queste istruzioni ; per controllare la tua versione, esegui java -version .
  • Conoscenza del linguaggio di programmazione Kotlin.

2. Ottieni il codice di esempio

Clona il repository

Clona il repository GitHub dalla riga di comando:

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

Importa in Android Studio

In Android Studio, seleziona File > Apri , quindi seleziona la directory build-android-start ( cartella_studio_android ) dalla directory in cui hai scaricato il codice di esempio.

Ora dovresti avere il progetto build-android-start aperto in Android Studio. Se vedi un avviso su un file google-services.json mancante, non preoccuparti. Verrà aggiunto in un passaggio successivo.

Controlla le dipendenze

In questo codelab tutte le dipendenze di cui avrai bisogno sono già state aggiunte per te, ma è importante capire come aggiungere l'SDK Firebase alla tua app:

build.gradle

buildscript {
    // ...

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

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

app/build.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:20.2.0'

    // Firebase SDK
    implementation platform('com.google.firebase:firebase-bom:30.3.2')
    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:8.0.1'
    implementation 'com.firebaseui:firebase-ui-database:8.0.1'
}

3. Installare l'interfaccia a riga di comando di Firebase

In questo codelab utilizzerai Firebase Emulator Suite per emulare localmente Firebase Auth, Realtime Database e Cloud Storage. Ciò fornisce un ambiente di sviluppo locale sicuro, veloce e gratuito per creare la tua app.

Installa l'interfaccia a riga di comando di Firebase

Per prima cosa dovrai installare la CLI di Firebase . Se utilizzi macOS o Linux, puoi eseguire il seguente comando cURL:

curl -sL https://firebase.tools | bash

Se stai usando Windows, leggi le istruzioni di installazione per ottenere un binario autonomo o per installare tramite npm .

Dopo aver installato la CLI, l'esecuzione di firebase --version dovrebbe riportare una versione 9.0.0 o successiva:

$ firebase --version
9.0.0

Accesso

Esegui firebase login per connettere la CLI al tuo account Google. Si aprirà una nuova finestra del browser per completare il processo di accesso. Assicurati di scegliere lo stesso account che hai utilizzato durante la creazione del progetto Firebase in precedenza.

4. Connettiti alla suite di emulatori Firebase

Avvia gli emulatori

Nel tuo terminale, esegui il seguente comando dalla radice della directory locale codelab-friendlychat-android :

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

Dovresti vedere alcuni log come questo. I valori delle porte sono stati definiti nel file firebase.json , incluso nel codice di esempio clonato.

$ 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.

Passare a http://localhost:4000 nel browser Web per visualizzare l'interfaccia utente di Firebase Emulator Suite:

Interfaccia utente dell'emulatore Suite home

Lascia il comando emulators:start in esecuzione per il resto del codelab.

Collega la tua app

In Android Studio, apri MainActivity.kt , quindi aggiungi il codice seguente all'interno del metodo 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. Esegui l'app di avviamento

Aggiungi google-services.json

Affinché la tua app Android si connetta a Firebase, devi aggiungere un file google-services.json all'interno della cartella app del tuo progetto Android. Ai fini di questo codelab, abbiamo fornito un file JSON fittizio che ti consentirà di connetterti a Firebase Emulator Suite.

Copia il file mock-google-services.json nella cartella build-android-start/app come google-services.json :

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

Nella fase finale di questo codelab, imparerai come creare un vero progetto Firebase e un'app Android Firebase in modo da poter sostituire questo file JSON fittizio con la tua configurazione.

Esegui l'app

Ora che hai importato il progetto in Android Studio e aggiunto un file JSON di configurazione Firebase, sei pronto per eseguire l'app per la prima volta.

  1. Avvia il tuo emulatore Android.
  2. In Android Studio, fai clic su Esegui (eseguire ) nella barra degli strumenti.

L'app dovrebbe avviarsi sul tuo emulatore Android. A questo punto, dovresti vedere un elenco di messaggi vuoto e l'invio e la ricezione di messaggi non funzioneranno. Nel passaggio successivo di questo codelab, autenticherai gli utenti in modo che possano utilizzare Friendly Chat.

6. Abilita l'autenticazione

Questa app utilizzerà Firebase Realtime Database per archiviare tutti i messaggi di chat. Prima di aggiungere dati, tuttavia, dobbiamo assicurarci che l'app sia sicura e che solo gli utenti autenticati possano pubblicare messaggi. In questo passaggio, abiliteremo l'autenticazione Firebase e configureremo le regole di sicurezza del database in tempo reale.

Aggiungi funzionalità di accesso di base

Successivamente aggiungeremo all'app del codice di autenticazione Firebase di base per rilevare gli utenti e implementare una schermata di accesso.

Verifica l'utente corrente

Innanzitutto aggiungi la seguente variabile di istanza alla classe MainActivity.kt :

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Ora modifichiamo MainActivity per inviare l'utente alla schermata di accesso ogni volta che apre l'app e non è autenticato. Aggiungi quanto segue al metodo onCreate() dopo che l' binding è stata collegata alla vista:

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
}

Vogliamo anche verificare se l'utente ha effettuato l'accesso durante 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
    }
}

Quindi implementa i getUserPhotoUrl() e getUserName() per restituire le informazioni appropriate sull'utente Firebase attualmente autenticato:

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
}

Quindi implementa il metodo signOut() per gestire il pulsante di disconnessione:

MainActivity.kt

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

Ora abbiamo tutta la logica in atto per inviare l'utente alla schermata di accesso quando necessario. Successivamente è necessario implementare la schermata di accesso per autenticare correttamente gli utenti.

Implementa la schermata di accesso

Apri il file SignInActivity.kt . Qui viene utilizzato un semplice pulsante di accesso per avviare l'autenticazione. In questa sezione utilizzerai FirebaseUI per implementare la logica per l'accesso.

Aggiungi una variabile di istanza Auth nella classe SignInActivity sotto il commento // Firebase instance variables :

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Quindi, modifica il metodo onCreate() per inizializzare Firebase nello stesso modo in cui hai fatto in MainActivity :

SignInActivity.kt

// Initialize FirebaseAuth
auth = Firebase.auth

Aggiungi un campo ActivityResultLauncher a SignInActivity :

SignInActivity.kt

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

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

Quindi, modifica il metodo onStart() per avviare il flusso di accesso di FirebaseUI:

SignInActivity.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()
    }
}

Quindi, implementa il metodo onSignInResult per gestire il risultato di accesso. Se il risultato dell'accesso ha avuto esito positivo, continua su MainActivity :

SignInActivity.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)
        }
    }
}

Questo è tutto! Hai implementato l'autenticazione con FirebaseUI in poche chiamate di metodo e senza dover gestire alcuna configurazione lato server.

Metti alla prova il tuo lavoro

Esegui l'app sul tuo emulatore Android. Dovresti essere immediatamente inviato alla schermata di accesso. Tocca il pulsante Accedi con e-mail , quindi crea un account. Se tutto è implementato correttamente, dovresti essere inviato alla schermata dei messaggi.

Dopo aver effettuato l'accesso, apri l'interfaccia utente di Firebase Emulator Suite nel browser, quindi fai clic sulla scheda Autenticazione per visualizzare il primo account utente connesso.

7. Leggi i messaggi

In questo passaggio, aggiungeremo funzionalità per leggere e visualizzare i messaggi archiviati nel database in tempo reale.

Importa messaggi di esempio

  1. Nell'interfaccia utente di Firebase Emulator Suite, seleziona la scheda Database in tempo reale .
  2. Trascina e rilascia il file initial_messages.json dalla tua copia locale del repository codelab nel visualizzatore di dati.

Ora dovresti avere alcuni messaggi nel nodo dei messages del database.

Leggi i dati

Sincronizza i messaggi

In questa sezione aggiungiamo il codice che sincronizza i messaggi appena aggiunti all'interfaccia utente dell'app tramite:

  • Inizializzazione del database Firebase Realtime e aggiunta di un listener per gestire le modifiche apportate ai dati.
  • Aggiornamento dell'adattatore RecyclerView in modo che vengano visualizzati i nuovi messaggi.
  • Aggiunta delle variabili dell'istanza del database con le altre variabili dell'istanza Firebase nella classe MainActivity :

MainActivity.kt

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

Modifica il metodo onCreate() di MainActivity sotto il commento // Initialize Realtime Database and FirebaseRecyclerAdapter con il codice definito di seguito. Questo codice aggiunge tutti i messaggi esistenti dal database in tempo reale e quindi ascolta le nuove voci figlio nel percorso dei messages nel database in tempo reale di Firebase. Aggiunge un nuovo elemento all'interfaccia utente per ogni messaggio:

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

Successivamente nella classe FriendlyMessageAdapter.kt implementa il metodo bind() all'interno della classe interna MessageViewHolder() :

FriendlyMessageAdapter.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)
        }
    }
    ...
}

Abbiamo anche bisogno di visualizzare i messaggi che sono immagini, quindi implementare anche il metodo bind() all'interno della classe interna ImageMessageViewHolder() :

FriendlyMessageAdapter.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)
        }
    }
}

Infine, torna in MainActivity , avvia e interrompi l'ascolto degli aggiornamenti dal database Firebase Realtime. Aggiorna i onPause() e onResume() in MainActivity come mostrato di seguito:

MainActivity.kt

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

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

Verifica la sincronizzazione dei messaggi

  1. Fare clic su Esegui (eseguire ).
  2. Nell'interfaccia utente di Emulator Suite, torna alla scheda Realtime Database , quindi aggiungi manualmente un nuovo messaggio. Verifica che il messaggio venga visualizzato nella tua app Android:

Congratulazioni, hai appena aggiunto un database in tempo reale alla tua app!

8. Invia messaggi

Implementare l'invio di messaggi di testo

In questa sezione, aggiungerai la possibilità per gli utenti dell'app di inviare messaggi di testo. Il frammento di codice seguente ascolta gli eventi di clic sul pulsante di invio, crea un nuovo oggetto FriendlyMessage con il contenuto del campo del messaggio e invia il messaggio al database. Il metodo push() aggiunge un ID generato automaticamente al percorso dell'oggetto inviato. Questi ID sono sequenziali, il che garantisce che i nuovi messaggi vengano aggiunti alla fine dell'elenco.

Aggiorna il listener di clic del pulsante di invio nel metodo onCreate() nella classe MainActivity . Questo codice è già in fondo al metodo onCreate() . Aggiorna il corpo di onClick() in modo che corrisponda al codice seguente:

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("")
}

Implementare l'invio di messaggi immagine

In questa sezione, aggiungerai la possibilità per gli utenti dell'app di inviare messaggi immagine. La creazione di un messaggio immagine viene eseguita con questi passaggi:

  • Seleziona immagine
  • Gestire la selezione delle immagini
  • Scrivere un messaggio immagine temporaneo nel database in tempo reale
  • Inizia a caricare l'immagine selezionata
  • Aggiorna l'URL del messaggio immagine con quello dell'immagine caricata, una volta completato il caricamento

Seleziona Immagine

Per aggiungere immagini, questo codelab utilizza Cloud Storage per Firebase. Cloud Storage è un buon posto per archiviare i dati binari della tua app.

Gestisci la selezione delle immagini e scrivi un messaggio temporaneo

Dopo che l'utente ha selezionato un'immagine, viene avviata la selezione dell'immagine Intent . Questo è già implementato nel codice alla fine del metodo onCreate() . Al termine, chiama il MainActivity onImageSelected() di MainActivity. Usando lo snippet di codice qui sotto, scriverai un messaggio con un URL immagine temporaneo al database indicando che l'immagine è in fase di caricamento.

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)
                    })
}

Carica l'immagine e aggiorna il messaggio

Aggiungi il metodo putImageInStorage() a MainActivity . Viene chiamato in onImageSelected() per avviare il caricamento dell'immagine selezionata. Una volta completato il caricamento, aggiornerai il messaggio per utilizzare l'immagine appropriata.

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
            )
        }
}

Prova l'invio di messaggi

  1. In Android Studio, fai clic sueseguire Pulsante Esegui .
  2. Nel tuo emulatore Android, inserisci un messaggio, quindi tocca il pulsante di invio. Il nuovo messaggio dovrebbe essere visibile nell'interfaccia utente dell'app e nell'interfaccia utente di Firebase Emulator Suite.
  3. Nell'emulatore Android, tocca l'immagine "+" per selezionare un'immagine dal tuo dispositivo. Il nuovo messaggio dovrebbe essere visibile prima con un'immagine segnaposto, quindi con l'immagine selezionata una volta completato il caricamento dell'immagine. Il nuovo messaggio dovrebbe essere visibile anche nell'interfaccia utente di Emulator Suite, in particolare come oggetto nella scheda Database in tempo reale e come BLOB nella scheda Archiviazione.

9. Congratulazioni!

Hai appena creato un'applicazione di chat in tempo reale utilizzando Firebase!

Cosa hai imparato

  • Autenticazione Firebase
  • Database in tempo reale di Firebase
  • Archiviazione cloud per Firebase

Quindi, prova a utilizzare ciò che hai imparato in questo codelab per aggiungere Firebase alla tua app Android! Per ulteriori informazioni su Firebase, visita firebase.google.com .

Se vuoi imparare come impostare un vero progetto Firebase e utilizzare risorse Firebase reali (invece di un progetto demo e solo risorse emulate), vai al passaggio successivo.

Nota: anche dopo aver impostato un vero progetto Firebase e soprattutto quando inizi a creare una vera app, ti consigliamo di utilizzare Firebase Local Emulator Suite per lo sviluppo e il test.

10. Facoltativo: crea e configura un progetto Firebase

In questo passaggio creerai un vero progetto Firebase e un'app Android Firebase da utilizzare con questo codelab. Aggiungerai anche la configurazione Firebase specifica per l'app alla tua app. E infine, imposterai risorse Firebase reali da utilizzare con la tua app.

Crea un progetto Firebase

  1. Nel tuo browser, vai alla console Firebase .
  2. Seleziona Aggiungi progetto .
  3. Seleziona o inserisci un nome di progetto. Puoi usare qualsiasi nome tu voglia.
  4. Non hai bisogno di Google Analytics per questo codelab, quindi puoi saltare l'abilitazione per il tuo progetto.
  5. Fare clic su Crea progetto . Quando il tuo progetto è pronto, fai clic su Continua .

Aggiungi Firebase al tuo progetto Android

Prima di iniziare questo passaggio, ottieni l'hash SHA1 della tua app. Esegui il comando seguente dalla directory build-android-start locale per determinare lo SHA1 della tua chiave di debug:

./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

Dovresti vedere un output come quello sopra. La linea importante è l'hash SHA1 . Se non riesci a trovare il tuo hash SHA1, consulta questa pagina per ulteriori informazioni.

Torna alla console Firebase e segui questi passaggi per registrare il tuo progetto Android con il tuo progetto Firebase:

  1. Dalla schermata di panoramica del tuo nuovo progetto, fai clic sull'icona Android per avviare il flusso di lavoro di configurazione: aggiungi l'app Android
  2. Nella schermata successiva, inserisci com.google.firebase.codelab.friendlychat come nome del pacchetto per la tua app.
  3. Fai clic su Registra app , quindi fai clic su Scarica google-services.json per scaricare il file di configurazione di Firebase.
  4. Copia il file google-services.json nella directory app del tuo progetto Android.
  5. Salta i passaggi successivi mostrati nel flusso di lavoro di configurazione della console (sono già stati eseguiti per te nel progetto build-android-start ).
  6. Assicurati che tutte le dipendenze siano disponibili per la tua app sincronizzando il tuo progetto con i file Gradle. Dalla barra degli strumenti di Android Studio, seleziona File > Sincronizza progetto con file Gradle . Potrebbe anche essere necessario eseguire Build/Clean Project e Build/Rebuild Project affinché avvengano le modifiche alla configurazione.

Configura l'autenticazione Firebase

Prima che la tua app possa accedere alle API di autenticazione Firebase per conto dei tuoi utenti, devi abilitare l'autenticazione Firebase e i provider di accesso che desideri utilizzare nella tua app.

  1. Nella console Firebase , seleziona Autenticazione dal pannello di navigazione a sinistra.
  2. Seleziona la scheda Metodo di accesso.
  3. Fare clic su Email/Password , quindi attivare l'interruttore su abilitato (blu).
  4. Fai clic su Google , quindi imposta l'interruttore su abilitato (blu) e imposta un'e-mail di supporto del progetto.

Se ricevi errori più avanti in questo codelab con il messaggio "CONFIGURATION_NOT_FOUND", torna a questo passaggio e ricontrolla il tuo lavoro.

Configura database in tempo reale

L'app in questo codelab memorizza i messaggi di chat nel database in tempo reale di Firebase. In questa sezione creeremo un database e configureremo la sua sicurezza tramite un linguaggio di configurazione JSON chiamato Firebase Security Rules.

  1. Nella console Firebase , seleziona Database in tempo reale dal pannello di navigazione a sinistra.
  2. Fare clic su Crea database per creare una nuova istanza di database in tempo reale. Quando richiesto, seleziona la regione us-central1 , quindi fai clic su Avanti .
  3. Quando ti vengono richieste le regole di sicurezza, scegli la modalità bloccata , quindi fai clic su Abilita .
  4. Una volta creata l'istanza del database, selezionare la scheda Regole , quindi aggiornare la configurazione delle regole con quanto segue:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

Per ulteriori informazioni sul funzionamento delle regole di sicurezza (inclusa la documentazione sulla variabile "auth"), vedere la documentazione sulla sicurezza del database in tempo reale .

Configura Cloud Storage per Firebase

  1. Nella console Firebase , seleziona Archiviazione dal pannello di navigazione sul lato sinistro.
  2. Fai clic su Inizia per abilitare Cloud Storage per il tuo progetto.
  3. Segui i passaggi nella finestra di dialogo per configurare il tuo bucket, utilizzando le impostazioni predefinite suggerite.

Connettiti alle risorse Firebase

In un passaggio precedente di questo codelab, hai aggiunto quanto segue a MainActivity.kt . Questo blocco condizionale ha collegato il tuo progetto Android alla Firebase Emulator Suite.

// 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)
}

Se desideri connettere la tua app al tuo nuovo progetto Firebase reale e alle sue risorse Firebase reali , puoi rimuovere questo blocco o eseguire la tua app in modalità di rilascio in modo che BuildConfig.DEBUG sia false .