Saya memiliki aplikasi yang menampilkan pemberitahuan khusus. Masalahnya adalah bahwa ketika berjalan di Android 5 ikon kecil di bilah Pemberitahuan ditampilkan dalam warna putih. Bagaimana saya bisa memperbaikinya?
Saya memiliki aplikasi yang menampilkan pemberitahuan khusus. Masalahnya adalah bahwa ketika berjalan di Android 5 ikon kecil di bilah Pemberitahuan ditampilkan dalam warna putih. Bagaimana saya bisa memperbaikinya?
Jawaban:
Jawaban yang diterima tidak (sepenuhnya) benar. Tentu, itu membuat ikon pemberitahuan tampil berwarna, tetapi melakukannya dengan kelemahan BESAR - dengan mengatur target SDK lebih rendah dari Android Lollipop!
Jika Anda memecahkan masalah ikon putih Anda dengan menetapkan target SDK Anda menjadi 20, seperti yang disarankan, aplikasi Anda tidak akan menargetkan Android Lollipop, yang berarti Anda tidak dapat menggunakan fitur khusus Lollipop.
Lihatlah http://developer.android.com/design/style/iconography.html , dan Anda akan melihat bahwa gaya putih adalah cara pemberitahuan ditampilkan di Android Lollipop.
Di Lollipop, Google juga menyarankan agar Anda menggunakan warna yang akan ditampilkan di belakang ikon pemberitahuan (putih) - https://developer.android.com/about/versions/android-5.0-changes.html
Jadi, saya pikir solusi yang lebih baik adalah menambahkan ikon siluet ke aplikasi dan menggunakannya jika perangkat menjalankan Android Lollipop.
Misalnya:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
Dan, dalam metode getNotificationIcon:
private int getNotificationIcon() {
boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
return useWhiteIcon ? R.drawable.icon_silhouette : R.drawable.ic_launcher;
}
ctrl+f
dan mengetik notification
di halaman itu ia tidak dapat menemukan apa pun ...
Sepenuhnya setuju dengan pengguna Daniel Saidi. Agar memiliki Color
untuk NotificationIcon
saya menulis jawaban ini.
Untuk itu, Anda harus membuat ikon seperti Silhouette
dan membuat beberapa bagian di Transparent
mana pun Anda ingin menambahkan Colors
. yaitu,
Anda dapat menambahkan warna menggunakan
.setColor(your_color_resource_here)
CATATAN: setColor
hanya tersedia di Lollipop
jadi, Anda harus memeriksaOSVersion
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Notification notification = new Notification.Builder(context)
...
} else {
// Lollipop specific setColor method goes here.
Notification notification = new Notification.Builder(context)
...
notification.setColor(your_color)
...
}
Anda juga dapat mencapai ini dengan menggunakan Lollipop
sebagai target SDK
.
Semua instruksi yang NotificationIcon
diberikan pada Baris Panduan Pemberitahuan Konsol Google Developer .
Ikon Notifikasi Pilihan Ukuran 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
Dan juga lihat tautan ini untuk Ukuran Ikon Pemberitahuan untuk info lebih lanjut.
setColor
pada Kitkat (API 19) dan IceCreamSandwich (API 15), dalam kedua kasus itu mengabaikan warna tetapi tidak crash . Jadi bisakah saya dengan aman menghilangkan memeriksa versi OS?
Ini adalah kode yang digunakan Android untuk menampilkan ikon pemberitahuan:
// android_frameworks_base/packages/SystemUI/src/com/android/systemui/
// statusbar/BaseStatusBar.java
if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
} else {
entry.icon.setColorFilter(null);
}
Jadi, Anda perlu mengatur versi target SDK untuk sesuatu <21
dan ikon akan tetap berwarna. Ini adalah solusi buruk tetapi melakukan apa yang diharapkan untuk dilakukan. Lagi pula, saya benar-benar menyarankan mengikuti Panduan Desain Google : "Ikon pemberitahuan harus sepenuhnya putih."
Inilah cara Anda dapat mengimplementasikannya:
Jika Anda menggunakan Gradle / Android Studio untuk membangun aplikasi Anda, gunakan build.gradle
:
defaultConfig {
targetSdkVersion 20
}
Jika tidak (Eclipse dll) gunakan AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
Untuk menghindari ikon Notifikasi menjadi putih, gunakan ikon "Silhouette" untuk mereka, yaitu. gambar latar belakang putih-transparan. Anda dapat menggunakan Irfanview untuk membangunnya:
IrfanView
, tekan F12 untuk alat melukis, bersihkan gambar jika perlu (hapus bagian yang tidak diinginkan, halus dan poles)Image / Decrease Color Depth
ke 2 (untuk gambar hitam putih)Image / Negative
(untuk putih pada gambar hitam)Image / Resize/Resample
hingga 144 x 144 (gunakan Metode Ukuran "Ubah Ukuran" bukan "Ubah Contoh", jika tidak gambar akan meningkat menjadi 24 bit warna per piksel (24 BPP) lagiFile / Save as PNG
, periksa Show option dialog
, periksa Save Transparent Color
, klik Save
, lalu klik pada warna hitam pada gambar untuk mengatur warna transparanAndroid tampaknya hanya menggunakan resolusi gambar drawable-xxhdpi (144 x 144), jadi salin ic_notification.png
file yang dihasilkan ke \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
. Gunakan .setSmallIcon(R.drawable.ic_notification)
dalam kode Anda, atau gunakan getNotificationIcon()
seperti yang disarankan Daniel Saidi di atas.
Anda juga dapat menggunakan Android Asset Studio Roman Nurik .
Pilihan lain adalah mengambil keuntungan dari direktori drawable (mipmap) versi-spesifik untuk memasok grafik yang berbeda untuk Lollipop dan yang lebih tinggi.
Di aplikasi saya, direktori "v21" berisi ikon dengan teks transparan sementara direktori lain berisi versi tidak transparan (untuk versi Android yang lebih tua dari Lollipop).
Yang seharusnya terlihat seperti ini:
Dengan cara ini, Anda tidak perlu memeriksa nomor versi dalam kode, mis
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_notification)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
Demikian juga, Anda dapat referensi "ic_notification" (atau apa pun yang Anda pilih untuk menyebutnya) dalam muatan GCM Anda jika Anda menggunakan atribut "ikon".
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(tanpa melibatkan kode tambahan) dengan cara itu?
Menurut pedoman desain Android Anda harus menggunakan siluet untuk builder.setSmallIcon(R.drawable.some_notification_icon);
Tetapi jika Anda masih ingin menunjukkan ikon berwarna-warni sebagai ikon pemberitahuan di sini adalah trik untuk lollipop dan penggunaan di atas di bawah kode. LargeIcon akan bertindak sebagai ikon pemberitahuan utama dan Anda juga harus memberikan siluet untuk smallIcon karena akan ditampilkan di kanan bawah largeIcon.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
builder.setColor(context.getResources().getColor(R.color.red));
builder.setSmallIcon(R.drawable.some_notification_icon);
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}
Dan pra-lolipop hanya digunakan .setSmallIcon(R.mipmap.ic_launcher)
dengan pembangun Anda.
Sekarang android studio menyediakan plugin Image Asset , yang akan menghasilkan ikon di semua folder drawbale yang diperlukan
Image Asset Studio membantu Anda membuat berbagai jenis ikon dengan kepadatan berbeda dan menunjukkan dengan tepat di mana mereka akan ditempatkan di proyek Anda. Ini termasuk alat untuk menyesuaikan ikon Anda dan menambahkan latar belakang, semua saat menampilkan hasilnya di panel pratinjau, sehingga mereka muncul persis seperti yang Anda inginkan. Alat-alat ini secara dramatis dapat merampingkan desain ikon dan proses impor.
Anda dapat mengakses Aset Gambar dengan mengklik baru> klik pada opsi Aset Gambar dan akan muncul jendela seperti ini: -
Saya menghadapi masalah yang sama dan itu karena ikon notifikasi aplikasi saya tidak datar. Untuk versi Android lollipop atau bahkan di bawah lollipop ikon pemberitahuan aplikasi Anda harus rata, jangan gunakan ikon dengan bayangan dll.
Di bawah ini adalah kode yang bekerja dengan sangat baik di semua versi Android
private void sendNotification(String msg) {
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(this, CheckOutActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.ic_notification)
.setContentTitle(getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg).setLights(Color.GREEN, 300, 300)
.setVibrate(new long[] { 100, 250 })
.setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}
Ikon yang salah
Ikon Kanan
alpha-channel adalah satu-satunya data gambar yang digunakan Android untuk ikon pemberitahuan:
alpha == 1
: piksel menunjukkan warna putihalpha == 0
: piksel ditampilkan sebagai warna yang Anda pilih Notification.Builder#setColor(int)
Ini disebutkan di https://developer.android.com/about/versions/android-5.0-changes.html :
Sistem mengabaikan semua saluran non-alfa dalam ikon aksi dan ikon pemberitahuan utama. Anda harus mengasumsikan bahwa ikon-ikon ini hanya akan menjadi alpha.
Hampir semua drawable bawaan sepertinya gambar alpha yang cocok untuk ini, jadi Anda bisa menggunakan sesuatu seperti:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
tapi saya masih mencari doc API yang secara resmi mengkonfirmasi itu.
Diuji pada Android 22.
setColor
pada Kitkat (API 19) dan IceCreamSandwich (API 15), dalam kedua kasus itu mengabaikan warna tetapi tidak crash . Jadi bisakah saya dengan aman menghilangkan memeriksa versi OS?
hapus android:targetSdkVersion="21"
dari manifest.xml. itu akan bekerja! dan dari ini tidak ada masalah sama sekali di apk Anda itu hanya trik saya menerapkan ini dan saya menemukan ikon berwarna-warni di pemberitahuan
Pemberitahuan berwarna abu - abu seperti yang dijelaskan di bawah ini. Mereka tidak hitam-putih, terlepas dari apa yang ditulis orang lain. Anda mungkin telah melihat ikon dengan banyak corak, seperti bilah kekuatan jaringan.
Sebelum API 21 (Lollipop 5.0), ikon warna berfungsi. Anda dapat memaksa aplikasi Anda untuk menargetkan API 20, tetapi itu membatasi fitur yang tersedia untuk aplikasi Anda, jadi itu tidak dianjurkan. Anda dapat menguji level API yang sedang berjalan dan mengatur ikon warna atau ikon skala abu-abu dengan tepat, tetapi ini mungkin tidak bermanfaat. Dalam kebanyakan kasus, yang terbaik adalah menggunakan ikon skala abu-abu.
Gambar memiliki empat saluran, RGBA (merah / hijau / biru / alfa). Untuk ikon notifikasi, Android mengabaikan saluran R, G, dan B. Satu-satunya saluran yang diperhitungkan adalah Alpha, juga dikenal sebagai opacity. Desain ikon Anda dengan editor yang memberi Anda kendali atas nilai Alpha warna gambar Anda.
Bagaimana nilai-nilai Alpha menghasilkan gambar skala abu-abu:
Mengubahnya dengan setColor
:
Panggil NotificationCompat.Builder.setColor(int argb)
. Dari dokumentasi untuk Notification.color
:
Warna aksen (bilangan bulat ARGB seperti konstanta dalam Warna) untuk diterapkan oleh templat Gaya standar saat menyajikan pemberitahuan ini. Desain template saat ini membangun gambar header berwarna-warni dengan overlay gambar ikon (stensil putih) di atas bidang warna ini. Komponen alfa diabaikan.
Pengujian saya dengan setColor menunjukkan bahwa komponen Alpha tidak diabaikan; sebagai gantinya, mereka masih menyediakan skala abu-abu. Nilai Alpha yang lebih tinggi menjadikan piksel putih. Nilai Alpha yang lebih rendah mengubah piksel ke warna latar belakang (hitam di perangkat saya) di area notifikasi, atau ke warna yang ditentukan dalam notifikasi pull-down. (Tampaknya orang lain melaporkan perilaku yang sedikit berbeda, jadi waspadalah!)
Pasca rilis Android Lollipop android telah mengubah pedoman untuk menampilkan ikon pemberitahuan di bilah Pemberitahuan. Dokumentasi resmi mengatakan "Perbarui atau hapus aset yang melibatkan warna. Sistem mengabaikan semua saluran non-alfa dalam ikon tindakan dan ikon pemberitahuan utama. Anda harus mengasumsikan bahwa ikon ini hanya akan alfa. Sistem menggambar ikon pemberitahuan dengan warna putih dan ikon tindakan dalam abu-abu gelap. " Sekarang apa artinya dalam istilah orang awam adalah "Konversi semua bagian gambar yang Anda tidak ingin tampilkan ke piksel transparan. Semua warna dan piksel yang tidak transparan ditampilkan dalam warna putih "
Anda dapat melihat bagaimana melakukan ini secara terperinci dengan tangkapan layar di sini https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
Semoga itu bisa membantu
Anda Perlu mengimpor gambar PNG transparan satu warna. Jadi, Anda dapat mengatur warna Ikon dari ikon kecil. Kalau tidak, itu akan ditampilkan putih di beberapa perangkat seperti MOTO
Jika Anda menggunakan GoogleFireBaseMessaging, Anda dapat mengatur "ikon id" di payload "pemberitahuan" (ini membantu saya untuk menyelesaikan masalah ikon bar putih):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
set ic_notification ke id Anda sendiri dari R.drawable.
Saya juga menghadapi terlalu banyak masalah dalam hal ini tetapi setelah mencari di internet saya menemukan solusi yang berbeda untuk masalah ini. Izinkan saya meringkas semua solusi dan menjelaskan:
Catatan: Solusi ini untuk pengguna cordova Phonegap
<preference name="android-targetSdkVersion" value="20"/>
Anda perlu mengatur nilai android-targetSdkVersion Anda menjadi kurang dari 21. Jadi setelah mengatur nilai ini, ikon Gambar pemberitahuan akan muncul hingga Android 6 (Marshmallow), Ini tidak akan berfungsi di Android 7 (Nougat). Solusi ini berhasil untuk saya.
<preference name="StatusBarStyle" value="lightcontent" />
Tetapi solusi ini hanya akan berfungsi ketika aplikasi Anda dibuka. Jadi, saya kira solusi ini bukan solusi terbaik tetapi berhasil bagi banyak pengguna.
Dan saya yakin salah satu solusi di atas akan bekerja untuk masalah Anda.
Saya pikir sudah terlambat untuk berbicara tentang API 21, tetapi saya menemukan cara yang mudah.
Saat menggunakan 'Pemberitahuan Kustom (tata letak khusus),
RemoteView
setImageViewResource(int viewId, int srcId);
dan
setImageViewUri(int viewId, Uri uri);
menjadikan gambar itu putih di Lollipop (API 21).
Tetapi saat menggunakan
setImageViewBitmap(int viewId, Bitmap bitmap);
Gambar tidak menjadi topeng putih!
Menurut dokumentasi, ikon pemberitahuan harus putih sejak Android 3.0 (API Level 11) :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
"Ikon bilah status hanya terdiri dari piksel putih pada latar belakang transparan, dengan campuran alpha digunakan untuk tepi yang halus dan tekstur internal yang sesuai."
mencampur dua hal ini dalam aplikasi gradle
defaultConfig {
applicationId "com.example.abdulwahidvi.notificationproblem"
minSdkVersion 16
//This is the version that was added by project by default
targetSdkVersion 26 <------ default
// Changed it to version 20
targetSdkVersion 20 <------ mine
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
android:targetSdkVersion="20"
seharusnya < 21
.