Gestern hat Google bei Google I / O das neue Benachrichtigungssystem vorgestellt, das auf der neuen Firebase basiert. Ich habe dieses neue FCM (Firebase Cloud Messaging) mit dem Beispiel auf Github ausprobiert.
Das Symbol der Benachrichtigung ist immer der ic_launcher, obwohl ich ein bestimmtes Drawable deklariert habe
Warum ? Hier unten der offizielle Code für die Bearbeitung der Nachricht
public class AppFirebaseMessagingService extends FirebaseMessagingService {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
sendNotification(remoteMessage);
}
// [END receive_message]
/**
* Create and show a simple notification containing the received FCM message.
*
* @param remoteMessage FCM RemoteMessage received.
*/
private void sendNotification(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// this is a my insertion looking for a solution
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(icon)
.setContentTitle(remoteMessage.getFrom())
.setContentText(remoteMessage.getNotification().getBody())
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Antworten:
Leider war dies eine Einschränkung der Firebase-Benachrichtigungen in SDK 9.0.0-9.6.1. Wenn sich die App im Hintergrund befindet, wird das Startsymbol aus dem Manifest (mit der erforderlichen Android-Tönung) für Nachrichten verwendet, die von der Konsole gesendet werden.
Mit SDK 9.8.0 können Sie jedoch die Standardeinstellung überschreiben! In Ihrer AndroidManifest.xml können Sie die folgenden Felder festlegen, um das Symbol und die Farbe anzupassen:
Beachten Sie, dass Sie die Anzeige vollständig mit Ihrer eigenen Logik anpassen können, wenn sich die App im Vordergrund befindet (oder eine Datennachricht gesendet wird). Sie können das Symbol auch jederzeit anpassen, wenn Sie die Nachricht über die HTTP / XMPP-APIs senden.
quelle
Verwenden Sie eine Serverimplementierung, um Nachrichten an Ihren Client zu senden, und verwenden Sie den Datentyp von Nachrichten anstelle des Benachrichtigungstyps von Nachrichten.
Auf diese Weise erhalten Sie einen Rückruf,
onMessageReceived
unabhängig davon, ob sich Ihre App im Hintergrund oder im Vordergrund befindet, und können dann Ihre benutzerdefinierte Benachrichtigung generierenquelle
atm sie arbeiten an diesem Problem https://github.com/firebase/quickstart-android/issues/4
Bearbeiten: Mit SDK 9.8.0 zu AndroidManifest.xml hinzufügen
quelle
Meine Lösung ähnelt der von ATom, ist jedoch einfacher zu implementieren. Sie müssen keine Klasse erstellen, die FirebaseMessagingService vollständig beschattet. Sie können lediglich die Methode überschreiben, die die Absicht empfängt (die zumindest in Version 9.6.1 öffentlich ist), und die anzuzeigenden Informationen aus den Extras übernehmen. Der "hackige" Teil ist, dass der Methodenname tatsächlich verschleiert ist und sich jedes Mal ändert, wenn Sie das Firebase-SDK auf eine neue Version aktualisieren. Sie können ihn jedoch schnell nachschlagen, indem Sie FirebaseMessagingService mit Android Studio überprüfen und nach einer öffentlichen Methode suchen, die dies erfordert eine Absicht als einziger Parameter. In Version 9.6.1 heißt es zzm. So sieht mein Service aus:
quelle
Setzen Sie einfach targetSdkVersion auf 19. Das Benachrichtigungssymbol wird farbig angezeigt. Warten Sie dann, bis Firebase dieses Problem behoben hat.
quelle
Es gibt auch einen hässlichen, aber funktionierenden Weg. Dekompilieren Sie FirebaseMessagingService.class und ändern Sie das Verhalten. Dann setzen Sie die Klasse einfach in das richtige Paket in Ihrer App und verwenden Sie sie dex anstelle der Klasse in der Messaging-Bibliothek. Es ist ganz einfach und funktioniert.
Es gibt Methode:
Dieser Code stammt aus Version 9.4.0. Die Methode hat aufgrund der Verschleierung unterschiedliche Namen in unterschiedlichen Versionen.
quelle
Wenn sich Ihre App im Hintergrund befindet, wird das Benachrichtigungssymbol auf der Nachrichtenempfangsmethode festgelegt. Wenn sich Ihre App jedoch im Vordergrund befindet, ist das Benachrichtigungssymbol dasjenige, das Sie im Manifest definiert haben
quelle
Ich löse meine Benachrichtigungen über die FCM-Konsole und über HTTP / JSON aus ... mit demselben Ergebnis.
Ich kann mit dem Titel und der vollständigen Nachricht umgehen, aber das Symbol ist immer ein weißer Standardkreis:
Benachrichtigungs-Screenshot
Anstelle meines benutzerdefinierten Symbols im Code (setSmallIcon oder setSmallIcon) oder des Standardsymbols aus der App:
quelle
Schreib Dies
rechts unten
<application.....>
quelle
Ich dachte, ich würde eine Antwort auf diese Frage hinzufügen, da mein Problem einfach, aber schwer zu bemerken war. Insbesondere hatte ich beim Erstellen von my ein vorhandenes Metadatenelement kopiert / eingefügt
com.google.firebase.messaging.default_notification_icon
, das einandroid:value
Tag zur Angabe seines Werts verwendete. Dies funktioniert nicht für das Benachrichtigungssymbol, und sobald ich es geändert habe, hatandroid:resource
alles wie erwartet funktioniert.quelle
default_notification_color
Meta, es muss eineandroid:resource
Einstellung sein,android:value
die nicht funktioniert