Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Android Studio + Firebase: A mensagem enviada do console não chega ao dispositivo

O Firebase foi configurado pelo Android Studio, informa que está conectado, que as dependências foram adicionadas com sucesso e nenhum erro é retornado, mas a mensagem enviada através do console não chega ao dispositivo.

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.alura.agenda">

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

    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality. 
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ListaAlunosActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FormularioActivity"
            android:label="@string/title_activity_formulario" />

        <receiver android:name=".receiver.SMSReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name=".ProvasActivity" />
        <activity android:name=".DetalhesProvaActivity" />
        <activity android:name=".ProvasTabletActivity" />
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity android:name=".MapaActivity"></activity>

        <service
            android:name=".firebase.AgendaInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
    </application>

</manifest>

AgendaInstanceIDService.java

package br.com.alura.agenda.firebase;

import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

public class AgendaInstanceIDService extends FirebaseInstanceIdService{

    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d("token firebase", refreshedToken);

        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String refreshedToken) {}
}

build.gradle (project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:3.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://maven.google.com" }
    }
}
15 respostas

build.gradle (app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        applicationId "br.com.alura.agenda"
        minSdkVersion 15
        targetSdkVersion 27
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }

    packagingOptions {
        exclude 'META-INF/LICENSE'
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit2:converter-jackson:2.1.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.2'
    implementation 'com.google.android.gms:play-services:12.0.1'
    implementation 'com.google.firebase:firebase-messaging:12.0.1'
}

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

Esqueci de ressaltar que o console do FCM informa que a mensagem foi enviada com sucesso.

:(

Oi Yuri, tudo parece correto...

Não consigo identificar um problema em específico, a não ser que esteja com algum problema no arquivo google-services.json que é usado como base para conectar o firebase e o app.

Quer tentar enviar o projeto via GitHub para eu dar uma olhada? Dessa forma eu faço o download e investigo se apresenta o mesmo problema.

[]s

Pode ser pelo Google Drive? Ainda não vi como funciona o GitHub.

Segue o link: Agenda

Oi Yuri, acabei de testar o seu projeto.

Recebi o token e também recebi a notificação. A única coisa que fiz foi mudar o arquivo google-service.json.

Sobre a parte de Git, recomendo que depois de uma olhada no curso de git, pois facilita tanto para você como para nós instrutores :)

Além disso, no mercado é bem provável que vão exigir conhecimentos sobre versionamento, logo, você já vai estar preparado ;)

[]s

Fala, professor!

Onde encontro e o que voce mudou no arquivo google-service.json?

Em relação do Git, já marquei para fazer o curso mais tarde. Percebi que era uma necessidade, mas achei melhor subir o projeto no Google Drive mesmo para descobrir esse problema do recebimento da notificação.

solução!

Opa Yuri,

tem esse tutorial bem descrito da própria Google que indica como pode ser obtido. De qualquer modo o jeito resumido é:

Console do Firebase > ícone de engrenagem > Configurações do projeto.

Nessa mesma página vai ter um botão escrito google-services.json é só clicar que ele faz o download. Então, você coloca ele no módulo app do projeto e pronto. É só testar.

Tranquilo sobre o envio, você fez certo, primeiro precisamos resolver os detalhes impactantes para depois planejar tarefas que podem ser feitas em um outro momento. Com toda a certeza vai ser muito útil aprender versionamento :)

[]s

Maravilha, professor! Obrigado! Vou testar à solução à noite e confirmo por aqui.

Só uma dúvida: por que este procedimento é necessário no meu caso? Durante os testes realizados na aula, o problema não aconteceu. Isso tem uma causa específica?

Vai tudo de caso a caso.

Se o arquivo não estivesse dentro do módulo app a conclusão é que o Firebase precisa desse arquivo para funcionar.

No seu caso, o arquivo está presente, conforme o link que me passou. Porém, por algum motivo ele, talvez, não esteja funcionando, então, para confirmar se é esse o problema, baixar o arquivo e substituir é uma boa tentativa, dado que foi apenas isso que fiz.

Pode ser que o problema não seja resolvido, então vai ser necessário investigar outros detalhes, como por exemplo, a rede, aparelho/emulador que está usando e por aí vai...

O que dificulta nesse tipo de investigação, é quando funciona no momento que testo, pois entendo que os requisitos mínimos (conforme visto em aula) foram feitos, então é algo que vai além.

Entendi. Pensei que fosse por alguma característica adicionada recentemente (ou não) ao Firebase e, por esta razão, eu teria outras configurações para fazer além do que foi explanado na aula.

Bom, vou testar a solução mais tarde e posto o resultado por aqui. Beleza?

Obrigado mesmo, professor!

Tranquilo, se não funcionar e achar alguma solução durante os testes, poste também que é bem importante para quem acompanhar todo o tópico :)

Também, fique à vontade em tirar dúvidas caso surja outros detalhes durante a investigação.

[]s

Pode deixar comigo, professor! Valeu mesmo.

(Y)

Oi, professor!

Deu tudo certo. A solução que apresentou resolveu o problema.

Obrigado pela ajuda!!

Opa Yuri, que ótimo que deu certo!

Bons estudos :)