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

Handle Messages

Olá,

Ao configurar o firebase no meu projeto, o terceiro passo é esse Handle Messages, pelo que eu entendi essa parte é para quando você quer fazer algum tipo de manipulação nas mensagens de push notification. Mas o que não entendi é se sou obrigada a implementar esse método, já que eu não vou, pelo menos nesse momento do curso, fazer alguma manipulação. Só implementei o método onNewToken, só que a notificação não chegou no emulador. Estou usando o Android Studio na versão 3.3.2

Pode me ajudar?

6 respostas

Oi Janaina, tudo bem?

Pode me mostrar como está a implementação do FirebaseMessagingService? Também me mostra como tá o seu arquivo de manifesto para verificar a declaração do service e o conteúdo dos 2 arquivos build.gradle.

Apenas para confirmar, o teste que está fazendo é com o App em background?

Obs: Acabei de criar um projeto novo, fiz as configurações e funcionou.

[]s

Oi Alex, tudo bem sim e você?

Eu não tava fazendo o teste com o app em background. Mas agora testei corretamente só que não funcionou. Vou te mostrar a implementação da classe:

package br.com.janainadev.agenda.firebase;

import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;

public class AgendaServiceIDMessage extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token) {
        Log.d("Token firebase", "Refreshed token: " + token);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(token);
    }

    private void sendRegistrationToServer(String token) {
    }
}

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.janainadev.agenda">
    <!--
         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.CALL_PHONE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <activity android:name=".MapaAlunosActivity"></activity>
        <!--
             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=".ProvasActivity" />
        <activity android:name=".FormularioActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

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

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

</manifest>

build.gradle nível Project:

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

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
        classpath 'com.google.gms:google-services:4.1.0'

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

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

e por fim o build.gradle nível App:

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

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "br.com.janainadev.agenda"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    implementation 'com.google.firebase:firebase-messaging:17.3.3'
    implementation 'com.google.firebase:firebase-core:16.0.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    implementation 'com.google.android.gms:play-services-location:15.0.1'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-jackson:2.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
}

Olhando os arquivos tudo parece certo... Está aparecendo o token gerado ao rodar o App?

Consegue verificar se o arquivo google-services.json está dentro do módulo app?

Um outro detalhe que costuma dar problema é a declaração do apply plugin: 'com.google.gms.google-services', segundo a documentação tem que ficar no final do arquivo de build.

Se mesmo verificando e ajustando conforme mencionado acima, ainda não resolver, me manda o projeto via GitHub que eu faço o teste.

[]s

solução!

Bom dia Alex,

Consegui!! Então o meu projeto tinha o arquivo google-services.json, coloquei a declaração do

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

No fim do arquivo build.gradle. Mas mesmo assim continuou não funcionando, nem aparecia o token do firebase no log. Quando olhei no logs, tinha essa mensagem:

"Default FirebaseApp failed to initialize because no default options were found. This usually means that com.google.gms:google-services was not applied to your gradle project."

Procurando google a fora, achei uma solução. No meu build.gradle no nível de projeto o classpath do google service estava na versão 4.1.0, e pelo que eu li essa versão apresenta alguns problemas com o firebase, para solucionar ou você faz um downgrade da versão (para 4.0.0) ou um upgrade da versão (4.2.0 a mais atual). Fiz o upgrade e tudo funcionou como esperado.

Vou deixar aqui o link de onde achei a solução para caso alguém tenha o mesmo problema:

https://stackoverflow.com/questions/40081539/default-firebaseapp-is-not-initialized

O meu build.gradle ficou assim:

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

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
        classpath 'com.google.gms:google-services:4.2.0'

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

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Obrigada!

Que bom que conseguiu Janaina! E muito obrigado por compartilhar os detalhes :)

Se todas as dúvidas do tópico foram sanadas, marque como solucionado.

[]s