2016-03-04 13 views
6

Po dodaniu do mojego powiadomienia kodu mNotificationBuilder.setLargeIcon(BitmapFactory.decodeResource( getResources(), R.drawable.ic_large_icon)); przestaje działać bez błędów i ostrzeżeń. Dzieje się tak tylko na pre-Lollipop, na Lollipop i poza nim działa świetnie. A z "uczynkami" mam na myśli to, że powiadomienie się pojawiło.Zestaw NotificationCompat.BuilderLargeIcon() nie działa?

mój przykładowy kod:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 

mBuilder.setSmallIcon(R.drawable.icon); 
mBuilder.setContentTitle("Content Title"); 
mBuilder.setContentText("Content Text"); 
mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_large_icon)); 

startForeground(1, mBuilder.build()); 

Próbowałem załadować bitmapę w różny sposób, ale to wciąż braku ... Ikona jest 128x128 więc rozmiar to nie powinno być problemem?

Próbowałem też różnych identyfikatorów, ale żaden nie rozwiązał problemu.

Byłbym bardzo wdzięczny za radę, proszę każde pchnięcie we właściwym kierunku oznaczałoby dla mnie cały świat.

EDIT 1 #

Zgłoszenie to zostało wydane z Serwisu. Usługa jest żywa, a Log prints informuje mnie, że kod po uruchomieniu "startForeground()".

+0

„Ikona jest 128x128 więc rozmiar to nie powinno być problemem?” - w jakim katalogu (lub katalogach) masz tę ikonę? – CommonsWare

+0

Res/drawable, również próbował użyć Android Asset Studio (przez Roman), aby wiele rozdzielczości umieścić w różnych podkatalogach. Ale to też nie pomogło. Czy istnieje jakakolwiek możliwość, że jest ona ważna tam, gdzie jest umieszczona? Próbuję użyć zwykłej klasy NotificationManager zamiast "startForeground()", ale byłoby dziwnie, gdyby to była przyczyna problemu. –

+0

'res/drawable /' prawie nigdy nie jest właściwą odpowiedzią. Jest to synonim 'res/drawable-mdpi /', więc obraz zostanie przeskalowany na urządzeniach o wyższej gęstości. Tak więc na urządzeniach o naprawdę wysokiej gęstości obraz, który zaczął się przy 128 x 128, może wznieść się do 512x512, w którym to momencie przekroczysz limit wielkości transakcji IPM o 1 MB. Możesz spojrzeć na 'Bitmapę', którą otrzymujesz z 'decodeResource()'. – CommonsWare

Odpowiedz

11

Najpierw należy ustawić dużą ikonę, a następnie małą ikonę.

w moim przypadku ten kod działa:

mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_message)); 
    mBuilder.setSmallIcon(R.mipmap.ic_message); 
    mBuilder.setContentTitle("Inbox"); 
    mBuilder.setContentText("New message received"); 
+2

nie działa dla mnie – vgarzom

+0

@vgarzom czy znalazłeś jakieś rozwiązanie? To też nie działa dla mnie –

2

Przed Lolipop nie było duża ikona powiadomień. Mała ikona powinna mieć rozmiar 64x64, a podczas tworzenia należy pamiętać, że będzie renderowana w dwóch kolorach: białym i przezroczystym.

NotificationCompat.Builder mBuilder; 

if (SystemTools.isAndroidApiVersionBeforeLollipop()) { 
       mBuilder = 
         new NotificationCompat.Builder(context) 
           .setContentIntent(pendingIntent) 
           .setSmallIcon(iconRid) 
           .setColor(ContextCompat.getColor(context, R.color.transparent)) 
           .setContentTitle(caption) 
           .setContentText(text) 
           .setOngoing(true) 
           .setWhen(0) 
           .setPriority(NotificationCompat.PRIORITY_LOW) 
       ; 
      } else { 
       mBuilder = 
         new NotificationCompat.Builder(context) 
           .setContentIntent(pendingIntent) 
           .setSmallIcon(iconRid) 
           .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), bigIconRid)) 
           .setColor(ContextCompat.getColor(context, R.color.transparent)) 
           .setContentTitle(caption) 
           .setContentText(text) 
           .setOngoing(true) 
           .setWhen(0) 
           .setPriority(NotificationCompat.PRIORITY_LOW) 
       ; 

}