Kemarin Google mempresentasikan di Google I / O sistem notifikasi baru berdasarkan Firebase baru. Saya mencoba FCM baru ini (Firebase Cloud Messaging) dengan contoh di Github.
Ikon notifikasi selalu ic_launcher meskipun saya telah menyatakan drawable spesifik
Mengapa Di sini di bawah kode resmi untuk menangani pesan
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());
}
}
Jawaban:
Sayangnya ini adalah batasan Notifikasi Firebase di SDK 9.0.0-9.6.1. Ketika aplikasi di latar belakang ikon peluncur digunakan dari manifes (dengan pewarnaan Android yang diperlukan) untuk pesan yang dikirim dari konsol.
Namun dengan SDK 9.8.0, Anda dapat mengganti default! Di AndroidManifest.xml Anda, Anda dapat mengatur bidang-bidang berikut untuk menyesuaikan ikon dan warna:
Perhatikan bahwa jika aplikasi berada di latar depan (atau pesan data dikirim), Anda dapat sepenuhnya menggunakan logika Anda sendiri untuk menyesuaikan tampilan. Anda juga dapat selalu menyesuaikan ikon jika mengirim pesan dari HTTP / XMPP APIs.
sumber
Gunakan implementasi server untuk mengirim pesan ke klien Anda dan menggunakan tipe data pesan, bukan tipe pemberitahuan pesan.
Ini akan membantu Anda menerima panggilan balik
onMessageReceived
terlepas dari apakah aplikasi Anda di latar belakang atau latar depan dan Anda dapat menghasilkan notifikasi khusus Anda kemudiansumber
atm mereka sedang mengerjakan masalah itu https://github.com/firebase/quickstart-android/issues/4
sunting: dengan SDK 9.8.0 tambahkan ke AndroidManifest.xml
sumber
Solusi saya mirip dengan ATom, tetapi lebih mudah diimplementasikan. Anda tidak perlu membuat kelas yang membayangi FirebaseMessagingService sepenuhnya, Anda bisa mengganti metode yang menerima Intent (yang bersifat publik, setidaknya dalam versi 9.6.1) dan mengambil informasi yang akan ditampilkan dari ekstra. Bagian "peretasan" adalah bahwa nama metode memang dikaburkan dan akan berubah setiap kali Anda memperbarui Firebase SDK ke versi baru, tetapi Anda dapat mencarinya dengan cepat dengan memeriksa FirebaseMessagingService dengan Android Studio dan mencari metode publik yang membutuhkan Intent sebagai satu-satunya parameter. Dalam versi 9.6.1 itu disebut zzm. Begini tampilannya layanan saya:
sumber
Cukup atur targetSdkVersion ke 19. Ikon pemberitahuan akan berwarna. Lalu tunggu Firebase untuk memperbaiki masalah ini.
sumber
Ada juga satu cara jelek tapi berfungsi. Dekompilasi FirebaseMessagingService.class dan modifikasi perilaku itu. Kemudian letakkan kelas ke paket yang tepat di aplikasi Anda dan gunakan itu bukan kelas di lib perpesanan itu sendiri. Cukup mudah dan berfungsi.
Ada metode:
Kode ini berasal dari versi 9.4.0, metode akan memiliki nama yang berbeda di versi yang berbeda karena kebingungan.
sumber
jika aplikasi Anda di latar belakang ikon pemberitahuan akan ditetapkan pada metode Penerimaan pesan tetapi jika aplikasi Anda di latar depan ikon pemberitahuan akan menjadi yang Anda tetapkan pada manifes
sumber
Saya memicu pemberitahuan dari konsol FCM dan melalui HTTP / JSON ... dengan hasil yang sama.
Saya dapat menangani judul, pesan lengkap, tetapi ikon selalu merupakan lingkaran putih default:
Tangkapan layar pemberitahuan
Alih-alih ikon kustom saya dalam kode (setSmallIcon atau setSmallIcon) atau ikon default dari aplikasi:
sumber
tulis ini
kanan bawah
<application.....>
sumber
Saya pikir saya akan menambahkan jawaban untuk yang ini, karena masalah saya sederhana tetapi sulit untuk diketahui. Khususnya saya telah menyalin / menempel elemen meta-data yang ada saat membuat saya
com.google.firebase.messaging.default_notification_icon
, yang menggunakanandroid:value
tag untuk menentukan nilainya. Ini tidak akan berfungsi untuk ikon notifikasi, dan begitu saya mengubahnya keandroid:resource
semuanya berfungsi seperti yang diharapkan.sumber
default_notification_color
meta, itu harusandroid:resource
- pengaturan karenaandroid:value
tidak akan berfungsi