Tôi có một ứng dụng hiển thị thông báo tùy chỉnh. Vấn đề là khi chạy trong Android 5, biểu tượng nhỏ trong thanh Thông báo được hiển thị màu trắng. Làm thế nào tôi có thể sửa lỗi này?
Tôi có một ứng dụng hiển thị thông báo tùy chỉnh. Vấn đề là khi chạy trong Android 5, biểu tượng nhỏ trong thanh Thông báo được hiển thị màu trắng. Làm thế nào tôi có thể sửa lỗi này?
Câu trả lời:
Câu trả lời được chấp nhận là không (hoàn toàn) chính xác. Chắc chắn, nó làm cho các biểu tượng thông báo hiển thị màu, nhưng làm như vậy với nhược điểm LỚN - bằng cách đặt SDK mục tiêu thấp hơn Android Lollipop!
Nếu bạn giải quyết vấn đề biểu tượng màu trắng của mình bằng cách đặt SDK mục tiêu của bạn thành 20, như được đề xuất, ứng dụng của bạn sẽ không nhắm mục tiêu Android Lollipop, điều đó có nghĩa là bạn không thể sử dụng các tính năng dành riêng cho Lollipop.
Hãy xem http://developer.android.com/design/style/iconography.html và bạn sẽ thấy rằng phong cách màu trắng là cách thông báo được hiển thị trong Android Lollipop.
Trong Lollipop, Google cũng đề nghị bạn sử dụng màu sẽ được hiển thị phía sau biểu tượng thông báo (màu trắng) - https://developer.android.com/about/versions/android-5.0-changes.html
Vì vậy, tôi nghĩ rằng một giải pháp tốt hơn là thêm biểu tượng hình bóng vào ứng dụng và sử dụng nó nếu thiết bị đang chạy Android Lollipop.
Ví dụ:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
Và, trong phương thức 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;
}
Hoàn toàn đồng ý với người dùng Daniel Saidi. Trong Đặt hàng để có Color
choNotificationIcon
tôi viết câu trả lời này.
Vì vậy, bạn đã tạo biểu tượng thích Silhouette
và tạo một số phần Transparent
bất cứ nơi nào bạn muốn thêm Colors
. I E,
Bạn có thể thêm màu của bạn bằng cách sử dụng
.setColor(your_color_resource_here)
LƯU Ý: setColor
chỉ có sẵn trong Lollipop
vì vậy, bạn phải kiểm traOSVersion
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)
...
}
Bạn cũng có thể đạt được điều này bằng cách sử dụng Lollipop
làm mục tiêu SDK
.
Tất cả các hướng dẫn liên quan NotificationIcon
được đưa ra tại Dòng Hướng dẫn Thông báo Bảng điều khiển dành cho nhà phát triển của Google .
Kích thước biểu tượng thông báo ưa thích 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
Và cũng tham khảo liên kết này cho Kích thước biểu tượng thông báo để biết thêm.
setColor
trên Kitkat (API 19) và IceCreamSandwich (API 15), trong cả hai trường hợp, nó đã bỏ qua màu sắc nhưng không gặp sự cố . Vì vậy, tôi có thể bỏ qua việc kiểm tra phiên bản hệ điều hành một cách an toàn không?
Đây là mã Android sử dụng để hiển thị các biểu tượng thông báo:
// 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);
}
Vì vậy, bạn cần đặt phiên bản sdk đích thành một cái gì đó <21
và các biểu tượng sẽ được tô màu. Đây là một cách giải quyết xấu xí nhưng nó làm những gì nó dự kiến sẽ làm. Dù sao, tôi thực sự khuyên bạn nên tuân theo Nguyên tắc thiết kế của Google : "Biểu tượng thông báo phải hoàn toàn màu trắng."
Đây là cách bạn có thể thực hiện nó:
Nếu bạn đang sử dụng Gradle / Android Studio để xây dựng ứng dụng của mình, hãy sử dụng build.gradle
:
defaultConfig {
targetSdkVersion 20
}
Mặt khác (Eclipse, v.v.) sử dụng AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
Để tránh các biểu tượng Thông báo chuyển sang màu trắng, hãy sử dụng biểu tượng "Silhouette" cho chúng, nghĩa là. hình ảnh nền trắng trong suốt. Bạn có thể sử dụng Irfanview để xây dựng chúng:
IrfanView
, nhấn F12 cho các công cụ vẽ, làm sạch hình ảnh nếu cần thiết (loại bỏ các phần không mong muốn, mịn và đánh bóng)Image / Decrease Color Depth
đến 2 (đối với ảnh đen trắng)Image / Negative
(cho một màu trắng trên hình đen)Image / Resize/Resample
thành 144 x 144 (sử dụng Phương pháp kích thước "Thay đổi kích thước" chứ không phải "Lấy mẫu lại", nếu không, hình ảnh được tăng lên 24 bit màu trên mỗi pixel (24 BPP) một lần nữaFile / Save as PNG
, kiểm tra Show option dialog
, kiểm tra Save Transparent Color
, nhấp Save
, sau đó nhấp vào màu đen trong hình ảnh để đặt màu trong suốtAndroid dường như chỉ sử dụng độ phân giải hình ảnh drawable-xxhdpi (144 x 144), vì vậy hãy sao chép ic_notification.png
tệp kết quả của bạn vào \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
. Sử dụng .setSmallIcon(R.drawable.ic_notification)
trong mã của bạn, hoặc sử dụng getNotificationIcon()
như Daniel Saidi đã đề xuất ở trên.
Bạn cũng có thể sử dụng Android Asset Studio của Roman Nurik .
Một tùy chọn khác là tận dụng các thư mục có thể vẽ (mipmap) dành riêng cho phiên bản để cung cấp đồ họa khác nhau cho Lollipop trở lên.
Trong ứng dụng của tôi, các thư mục "v21" chứa các biểu tượng có văn bản trong suốt trong khi các thư mục khác chứa phiên bản không trong suốt (đối với các phiên bản Android cũ hơn Lollipop).
Mà sẽ trông giống như thế này:
Bằng cách này, bạn không cần kiểm tra số phiên bản trong mã, ví dụ:
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);
Tương tự, bạn có thể tham chiếu "ic_notification" (hoặc bất cứ điều gì bạn chọn để gọi nó) trong tải trọng GCM của bạn nếu bạn sử dụng thuộc tính "icon".
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(không liên quan đến mã bổ sung) theo cách đó?
Theo hướng dẫn thiết kế Android, bạn phải sử dụng hình bóng cho builder.setSmallIcon(R.drawable.some_notification_icon);
Nhưng nếu bạn vẫn muốn hiển thị biểu tượng đầy màu sắc dưới dạng biểu tượng thông báo thì đây là mẹo cho kẹo mút và sử dụng mã bên dưới. LargeIcon sẽ hoạt động như một biểu tượng thông báo chính và bạn cũng cần cung cấp hình bóng cho smallIcon vì nó sẽ được hiển thị ở phía dưới bên phải của smallIcon.
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));
}
Và tiền kẹo chỉ sử dụng .setSmallIcon(R.mipmap.ic_launcher)
với người xây dựng của bạn.
Bây giờ android studio được cung cấp một plugin Image Asset , sẽ được tạo biểu tượng trong tất cả các thư mục drawbale cần thiết
Image Asset Studio giúp bạn tạo các loại biểu tượng khác nhau với mật độ khác nhau và hiển thị cho bạn chính xác vị trí chúng sẽ được đặt trong dự án của bạn. Nó bao gồm các công cụ để điều chỉnh biểu tượng của bạn và thêm phông nền, tất cả trong khi hiển thị kết quả trong khung xem trước, để chúng xuất hiện chính xác như bạn dự định. Những công cụ này có thể hợp lý hóa đáng kể quá trình thiết kế và nhập biểu tượng.
Bạn có thể truy cập Tài sản hình ảnh bằng cách nhấp vào mới> nhấp vào tùy chọn Tài sản hình ảnh và nó sẽ được hiển thị cửa sổ như thế này: -
Tôi đã phải đối mặt với cùng một vấn đề và đó là do biểu tượng thông báo ứng dụng của tôi không phẳng. Đối với kẹo mút phiên bản Android hoặc thậm chí dưới kẹo mút, biểu tượng thông báo ứng dụng của bạn phải bằng phẳng, không sử dụng biểu tượng có bóng, v.v.
Dưới đây là mã hoạt động hoàn toàn tốt trên tất cả các phiên bản 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());
}
Biểu tượng sai
Biểu tượng bên phải
kênh alpha là dữ liệu duy nhất của hình ảnh mà Android sử dụng cho các biểu tượng thông báo:
alpha == 1
: pixel hiển thị màu trắngalpha == 0
: pixel hiển thị như màu bạn đã chọn Notification.Builder#setColor(int)
Điều này được đề cập tại https://developer.android.com/about/versions/android-5.0-changes.html :
Hệ thống bỏ qua tất cả các kênh không alpha trong các biểu tượng hành động và trong biểu tượng thông báo chính. Bạn nên cho rằng các biểu tượng này sẽ chỉ ở dạng alpha.
Hầu như tất cả các drawable tích hợp dường như là hình ảnh alpha phù hợp cho việc này, vì vậy bạn có thể sử dụng một cái gì đó như:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
nhưng tôi vẫn đang tìm tài liệu API chính thức xác nhận điều đó.
Đã thử nghiệm trên Android 22.
setColor
trên Kitkat (API 19) và IceCreamSandwich (API 15), trong cả hai trường hợp, nó đã bỏ qua màu sắc nhưng không gặp sự cố . Vì vậy, tôi có thể bỏ qua việc kiểm tra phiên bản hệ điều hành một cách an toàn không?
xóa android:targetSdkVersion="21"
tệp kê khai. nó sẽ làm việc và từ đây không có vấn đề gì trong apk của bạn, đó chỉ là một mẹo tôi áp dụng điều này và tôi đã tìm thấy biểu tượng đầy màu sắc trong thông báo
Thông báo là thang độ xám như được giải thích dưới đây. Chúng không phải là màu đen và trắng, bất chấp những gì người khác đã viết. Bạn có thể đã thấy các biểu tượng với nhiều sắc thái, như các thanh cường độ mạng.
Trước API 21 (Lollipop 5.0), các biểu tượng màu hoạt động. Bạn có thể buộc ứng dụng của mình nhắm mục tiêu API 20, nhưng điều đó giới hạn các tính năng có sẵn cho ứng dụng của bạn, vì vậy không nên sử dụng ứng dụng này. Bạn có thể kiểm tra mức API đang chạy và đặt biểu tượng màu hoặc biểu tượng thang độ xám một cách thích hợp, nhưng điều này có thể không đáng giá. Trong hầu hết các trường hợp, tốt nhất là đi với một biểu tượng thang độ xám.
Hình ảnh có bốn kênh, RGBA (đỏ / xanh / xanh / alpha). Đối với các biểu tượng thông báo, Android bỏ qua các kênh R, G và B. Kênh duy nhất được tính là Alpha, còn được gọi là độ mờ. Thiết kế biểu tượng của bạn với trình chỉnh sửa cho phép bạn kiểm soát giá trị Alpha của màu vẽ.
Cách các giá trị Alpha tạo ra hình ảnh thang độ xám:
Thay đổi nó bằng setColor
:
Gọi NotificationCompat.Builder.setColor(int argb)
. Từ tài liệu cho Notification.color
:
Màu nhấn (một số nguyên ARGB như các hằng số trong Màu) được áp dụng bởi các mẫu Kiểu chuẩn khi trình bày thông báo này. Thiết kế mẫu hiện tại xây dựng một hình ảnh tiêu đề đầy màu sắc bằng cách phủ lên hình ảnh biểu tượng (được tô màu trắng) trên một trường có màu này. Các thành phần Alpha bị bỏ qua.
Thử nghiệm của tôi với setColor cho thấy các thành phần Alpha không bị bỏ qua; thay vào đó, họ vẫn cung cấp thang độ xám. Giá trị Alpha cao hơn biến một pixel trắng. Các giá trị Alpha thấp hơn biến pixel thành màu nền (màu đen trên thiết bị của tôi) trong vùng thông báo hoặc thành màu được chỉ định trong thông báo kéo xuống. (Có vẻ như những người khác đã báo cáo hành vi hơi khác nhau, vì vậy hãy lưu ý!)
Đăng Android Lollipop phát hành Android đã thay đổi các hướng dẫn để hiển thị các biểu tượng thông báo trong thanh Thông báo. Tài liệu chính thức có nội dung "Cập nhật hoặc xóa tài sản liên quan đến màu sắc. Hệ thống bỏ qua tất cả các kênh không phải alpha trong các biểu tượng hành động và trong biểu tượng thông báo chính. Bạn nên giả sử rằng các biểu tượng này sẽ chỉ ở dạng alpha. Hệ thống sẽ vẽ các biểu tượng thông báo màu trắng và các biểu tượng hành động trong màu xám đen. Bây giờ điều đó có nghĩa là theo thuật ngữ của người đàn ông là "Chuyển đổi tất cả các phần của hình ảnh mà bạn không muốn hiển thị thành các pixel trong suốt. Tất cả các màu và pixel không trong suốt được hiển thị màu trắng "
Bạn có thể xem cách thực hiện điều này một cách chi tiết bằng ảnh chụp màn hình tại đây https://blog.clevertap.com/fixing-notification-icon-for-android-leets-and-above/
Mong rằng sẽ giúp
Bạn cần nhập hình ảnh PNG trong suốt một màu. Vì vậy, bạn có thể đặt màu Biểu tượng của biểu tượng nhỏ. Nếu không, nó sẽ được hiển thị màu trắng trong một số thiết bị như MOTO
Nếu bạn đang sử dụng GoogleFireBaseMessaging, bạn có thể đặt "id biểu tượng" trong tải trọng "thông báo" (nó giúp tôi giải quyết vấn đề về biểu tượng thanh trắng):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
đặt ic_notification thành id của riêng bạn từ R.drawable.
Tôi cũng phải đối mặt với quá nhiều vấn đề trong vấn đề này nhưng sau khi tìm kiếm trên internet tôi đã tìm thấy các giải pháp khác nhau cho vấn đề này. Hãy cho tôi tổng hợp tất cả các giải pháp và giải thích:
Lưu ý: Giải pháp này dành cho người dùng Phonegap cordova
<preference name="android-targetSdkVersion" value="20"/>
Bạn cần đặt giá trị android-targetSdkVersion của mình dưới 21. Vì vậy, sau khi đặt giá trị này, hình ảnh biểu tượng Thông báo sẽ xuất hiện cho đến Android 6 (Marshmallow), Nó sẽ không hoạt động trong Android 7 (Nougat). Giải pháp này đã làm việc cho tôi.
<preference name="StatusBarStyle" value="lightcontent" />
Nhưng giải pháp này sẽ chỉ hoạt động khi ứng dụng của bạn được mở. Vì vậy, tôi đoán giải pháp này không phải là giải pháp tốt nhất nhưng nó hiệu quả với nhiều người dùng.
Và tôi chắc chắn một trong những giải pháp trên sẽ có tác dụng cho vấn đề của bạn.
Tôi nghĩ đã quá muộn để nói về API 21, nhưng tôi đã tìm thấy một cách dễ dàng.
Khi sử dụng 'Thông báo tùy chỉnh (bố cục tùy chỉnh)' s,
RemoteView của
setImageViewResource(int viewId, int srcId);
và
setImageViewUri(int viewId, Uri uri);
làm cho những hình ảnh đó trở nên trắng trên Lollipop (API 21).
Nhưng khi sử dụng
setImageViewBitmap(int viewId, Bitmap bitmap);
Hình ảnh không trở thành mặt nạ trắng!
Theo tài liệu, biểu tượng thông báo phải có màu trắng kể từ Android 3.0 (API cấp 11) :
https://developer.android.com/guide/practices/ui_guferences/icon_design_status_bar
"Các biểu tượng trên thanh trạng thái được cấu tạo đơn giản bằng các pixel trắng trên phông nền trong suốt, với pha trộn alpha được sử dụng cho các cạnh mịn và kết cấu bên trong khi thích hợp."
trộn hai thứ này trong lớp ứng dụng
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"
nó nên là < 21
.