मेरे पास कस्टम सूचना दिखाने वाला एक ऐप है। समस्या यह है कि एंड्रॉइड 5 में चलने पर नोटिफिकेशन बार में छोटा आइकन सफेद रंग में दिखाया गया है। मैं इसे कैसे ठीक करूं?
मेरे पास कस्टम सूचना दिखाने वाला एक ऐप है। समस्या यह है कि एंड्रॉइड 5 में चलने पर नोटिफिकेशन बार में छोटा आइकन सफेद रंग में दिखाया गया है। मैं इसे कैसे ठीक करूं?
जवाबों:
स्वीकृत उत्तर सही (पूर्णतः) नहीं है। ज़रूर, यह नोटिफिकेशन आइकॉन को रंग में दिखाता है, लेकिन एक बड़ी कमी के साथ ऐसा करता है - लक्ष्य एसडीके को एंड्रॉइड लॉलीपॉप से कम करने के लिए सेट करके!
यदि आप सुझाव के अनुसार अपने लक्ष्य एसडीके को 20 तक सेट करके अपनी सफेद आइकन समस्या को हल करते हैं, तो आपका ऐप एंड्रॉइड लॉलीपॉप को लक्षित नहीं करेगा, जिसका अर्थ है कि आप लॉलीपॉप-विशिष्ट सुविधाओं का उपयोग नहीं कर सकते।
Http://developer.android.com/design/style/iconography.html पर एक नज़र डालें , और आप देखेंगे कि सफेद शैली यह है कि एंड्रॉइड लॉलीपॉप में सूचनाओं को कैसे प्रदर्शित किया जाता है।
लॉलीपॉप में, Google यह भी सुझाव देता है कि आप एक ऐसे रंग का उपयोग करें जिसे (सफेद) अधिसूचना आइकन के पीछे प्रदर्शित किया जाएगा - https://developer.android.com/about/versions/android-5.0-changes.html
इसलिए, मुझे लगता है कि एक बेहतर समाधान ऐप में एक सिल्हूट आइकन जोड़ना है और इसका उपयोग करना है यदि डिवाइस एंड्रॉइड लॉलीपॉप चला रहा है।
उदाहरण के लिए:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
और, 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;
}
उपयोगकर्ता डैनियल सैडी के साथ पूरी तरह से सहमत हैं। आदेश में करने के लिए Color
के लिए NotificationIcon
मैं इस सवाल का जवाब लिख रहा हूँ।
इसके लिए आपको आइकन बनाना होगा Silhouette
और Transparent
जहाँ भी आप जोड़ना चाहें, कुछ सेक्शन बना सकते हैं Colors
। अर्थात,
आप अपने रंग का उपयोग करके जोड़ सकते हैं
.setColor(your_color_resource_here)
नोट: setColor
केवल में उपलब्ध है Lollipop
, आप की जाँच करने के लिए हैOSVersion
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)
...
}
आप इसे Lollipop
लक्ष्य के रूप में उपयोग करके भी प्राप्त कर सकते हैं SDK
।
Google डेवलपर कंसोल नोटिफिकेशन गाइड लाइन्स में NotificationIcon
दिए गए सभी निर्देश ।
पसंदीदा सूचना चिह्न आकार 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
और अधिक जानकारी के लिए अधिसूचना आइकन आकार के लिए इस लिंक को भी देखें ।
setColor
किटकैट (एपीआई 19) और आइसक्रीमसैंडविच (एपीआई 15) पर परीक्षण किया है , दोनों ही मामलों में इसने रंग को नजरअंदाज किया लेकिन दुर्घटनाग्रस्त हो गया । तो क्या मैं ओएस संस्करण की जाँच को सुरक्षित रूप से छोड़ सकता हूँ?
यह अधिसूचना आइकन प्रदर्शित करने के लिए एंड्रॉइड का उपयोग करता है कोड है:
// 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);
}
तो आपको कुछ करने के लिए लक्ष्य एसडीके संस्करण सेट करना होगा <21
और आइकन रंगीन रहेंगे। यह एक बदसूरत वर्कअराउंड है लेकिन यह वही करता है जो इसे करने की उम्मीद है। वैसे भी, मैं वास्तव में Google के डिज़ाइन दिशानिर्देशों का पालन करने का सुझाव देता हूं : "अधिसूचना आइकन पूरी तरह से सफेद होना चाहिए।"
यहाँ आप इसे कैसे लागू कर सकते हैं:
यदि आप अपने ऐप्स बनाने के लिए ग्रेडल / एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो उपयोग करें build.gradle
:
defaultConfig {
targetSdkVersion 20
}
अन्यथा (ग्रहण आदि) का उपयोग करें AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
सफेद होने के लिए अधिसूचना आइकन से बचने के लिए, उनके लिए "सिल्हूट" आइकन का उपयोग करें, अर्थात। सफेद-पर-पारदर्शी पृष्ठभूमि चित्र। आप उन्हें बनाने के लिए इरफानव्यू का उपयोग कर सकते हैं:
IrfanView
चित्र उपकरण के लिए F12 दबाएँ, यदि आवश्यक हो तो चित्र साफ़ करें (अवांछित भागों, चिकनी और पॉलिश को हटा दें)Image / Decrease Color Depth
2 के लिए (एक काले और सफेद तस्वीर के लिए)Image / Negative
(काली तस्वीर पर एक सफेद के लिए)Image / Resize/Resample
144 x 144 के लिए (साइज़ मेथड "रिसाइज़" नॉट "रेम्प्लम" का उपयोग करें, अन्यथा चित्र को 24 पिक्सेल प्रति पिक्सेल 24 बिट्स तक बढ़ाया जाता है)File / Save as PNG
, चेक Show option dialog
, चेक Save Transparent Color
, क्लिक करें Save
, फिर पारदर्शी रंग सेट करने के लिए छवि में काले रंग पर क्लिक करेंलगता है कि Android केवल ड्रॉबल-xxhdpi चित्र रिज़ॉल्यूशन (144 x 144) का उपयोग कर रहा है, इसलिए अपनी परिणामी ic_notification.png
फ़ाइल को कॉपी करें \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
। .setSmallIcon(R.drawable.ic_notification)
अपने कोड में उपयोग करें , या getNotificationIcon()
ऊपर दिए गए डैनियल सैडी के रूप में उपयोग करें ।
आप रोमन नुरिक के एंड्रॉइड एसेट स्टूडियो का भी उपयोग कर सकते हैं ।
एक अन्य विकल्प लॉलीपॉप और इसके बाद के संस्करण के लिए विभिन्न ग्राफिक्स की आपूर्ति करने के लिए संस्करण-विशिष्ट ड्रिबल (mipmap) निर्देशिकाओं का लाभ उठाना है।
मेरे ऐप में, "v21" निर्देशिकाओं में पारदर्शी पाठ वाले आइकन हैं जबकि अन्य निर्देशिकाओं में गैर-पारदर्शी संस्करण (लॉलीपॉप से पुराने एंड्रॉइड के संस्करणों के लिए) हैं।
जो कुछ इस तरह दिखना चाहिए:
इस तरह, आपको कोड में संस्करण संख्याओं के लिए जाँच करने की आवश्यकता नहीं है, जैसे
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);
इसी तरह, यदि आप "आइकन" विशेषता का उपयोग करते हैं, तो आप अपने GCM पेलोड में "ic_notification" (या जो भी आप इसे कॉल करना चुनते हैं) को संदर्भित कर सकते हैं।
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(अतिरिक्त कोड को शामिल किए बिना) कैसे सेट कर सकते हैं ?
एंड्रॉइड डिज़ाइन दिशानिर्देशों के अनुसार आपको एक सिल्हूट का उपयोग करना होगा builder.setSmallIcon(R.drawable.some_notification_icon);
लेकिन यदि आप अभी भी एक रंगीन आइकन दिखाना चाहते हैं, तो यहां अधिसूचना आइकन के रूप में लॉलीपॉप और ऊपर कोड के नीचे उपयोग के लिए चाल है। लार्जआईकॉन एक प्राथमिक अधिसूचना आइकन के रूप में कार्य करेगा और आपको छोटे आईकॉन के लिए एक सिल्हूट प्रदान करने की भी आवश्यकता है क्योंकि यह लार्जकॉन के नीचे दाईं ओर दिखाया जाएगा।
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));
}
और प्री-लॉलीपॉप केवल .setSmallIcon(R.mipmap.ic_launcher)
अपने बिल्डर के साथ उपयोग करें।
अब एंड्रॉइड स्टूडियो एक प्लगइन छवि एसेट प्रदान करता है , जो सभी आवश्यक ड्राबेल फ़ोल्डर में आइकन उत्पन्न करेगा
इमेज एसेट स्टूडियो आपको विभिन्न घनत्वों पर विभिन्न प्रकार के आइकन बनाने में मदद करता है और आपको दिखाता है कि उन्हें आपके प्रोजेक्ट में कहां रखा जाएगा। इसमें आपके आइकन समायोजित करने और पृष्ठभूमि जोड़ने के लिए उपकरण शामिल हैं, सभी पूर्वावलोकन फलक में परिणाम प्रदर्शित करते हैं, इसलिए वे आपके इच्छित उद्देश्य के अनुसार दिखाई देते हैं। ये उपकरण नाटकीय रूप से आइकन डिज़ाइन और आयात प्रक्रिया को कारगर बना सकते हैं।
आप इमेज एसेट पर क्लिक करके नए पर क्लिक करें> इमेज एसेट विकल्प पर क्लिक करें और यह इस तरह विंडो दिखाएगा: -
मैं एक ही मुद्दे का सामना कर रहा था और यह मेरे ऐप अधिसूचना आइकन के कारण सपाट नहीं था। एंड्रॉइड वर्जन के लिए लॉलीपॉप या उससे भी नीचे लॉलीपॉप के लिए आपका ऐप नोटिफिकेशन आइकन फ्लैट होना चाहिए, छाया के साथ आइकन का उपयोग न करें आदि।
नीचे वह कोड है जो सभी 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());
}
गलत आइकन
राइट आइकन
अल्फा-चैनल उस छवि का एकमात्र डेटा है जिसे Android अधिसूचना आइकन के लिए उपयोग करता है:
alpha == 1
: पिक्सेल सफेद दिखाते हैंalpha == 0
: पिक्सेल आपके द्वारा चुने गए रंग के रूप में दिखाते हैं Notification.Builder#setColor(int)
इसका उल्लेख https://developer.android.com/about/versions/android-5.0-changes.html पर किया गया है :
सिस्टम एक्शन आइकन और मुख्य सूचना आइकन में सभी गैर-अल्फा चैनलों को अनदेखा करता है। आपको यह मान लेना चाहिए कि ये आइकन केवल अल्फा होंगे।
लगभग सभी अंतर्निर्मित आरेख इसके लिए उपयुक्त अल्फ़ा चित्र प्रतीत होते हैं, इसलिए आप कुछ इस तरह का उपयोग कर सकते हैं:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
लेकिन मैं अभी भी एपीआई डॉक्टर की तलाश कर रहा हूं जो आधिकारिक तौर पर इसकी पुष्टि करता है।
Android 22 पर परीक्षण किया गया।
setColor
किटकैट (एपीआई 19) और आइसक्रीमसैंडविच (एपीआई 15) पर परीक्षण किया है , दोनों ही मामलों में इसने रंग को नजरअंदाज किया लेकिन दुर्घटनाग्रस्त हो गया । तो क्या मैं ओएस संस्करण की जाँच को सुरक्षित रूप से छोड़ सकता हूँ?
android:targetSdkVersion="21"
मैनिफ़ेस्ट से निकालें । xml। यह काम करेगा! और इससे आपके APK में कोई संभावना नहीं है, यह सिर्फ एक चाल है जो मैंने इसे लागू किया है और मुझे अधिसूचना में रंगीन आइकन मिला है
नीचे बताए अनुसार नोटिफिकेशन greyscale हैं। वे काले-गोरे नहीं हैं, इसके बावजूद कि दूसरों ने क्या लिखा है। आपने संभवतः नेटवर्क स्ट्रेंथ बार जैसे कई शेड्स वाले आइकन देखे हैं।
एपीआई 21 (लॉलीपॉप 5.0) से पहले, रंग आइकन काम करते हैं। आप अपने एप्लिकेशन को एपीआई 20 को लक्षित करने के लिए बाध्य कर सकते हैं, लेकिन यह आपके आवेदन के लिए उपलब्ध सुविधाओं को सीमित करता है, इसलिए यह अनुशंसित नहीं है। आप चल रहे एपीआई स्तर का परीक्षण कर सकते हैं और या तो एक रंग आइकन या एक ग्रेस्केल आइकन को उचित रूप से सेट कर सकते हैं, लेकिन यह संभवतः सार्थक नहीं है। ज्यादातर मामलों में, एक ग्रेस्केल आइकन के साथ जाना सबसे अच्छा है।
छवियों में चार चैनल हैं, RGBA (लाल / हरा / नीला / अल्फा)। अधिसूचना आइकन के लिए, Android R, G और B चैनल को अनदेखा करता है। एकमात्र चैनल जो मायने रखता है वह अल्फा है, जिसे अपारदर्शिता भी कहा जाता है। अपने आइकन को एक संपादक के साथ डिज़ाइन करें जो आपको अपने ड्राइंग रंगों के अल्फा मान पर नियंत्रण देता है।
कैसे अल्फा मान एक ग्रेस्केल छवि उत्पन्न करते हैं:
इसे बदलना setColor
:
पुकारते हैं NotificationCompat.Builder.setColor(int argb)
। के लिए प्रलेखन से Notification.color
:
इस नोटिफिकेशन को प्रस्तुत करते समय स्टैण्डर्ड कलर (रंग में स्थिरांक की तरह एआरजीएन पूर्णांक) को मानक स्टाइल टेम्प्लेट द्वारा लागू किया जाना चाहिए। वर्तमान टेम्प्लेट डिज़ाइन इस रंग के एक क्षेत्र के ऊपर आइकन छवि (सफ़ेद रंग में सना हुआ) को ओवरले करके एक रंगीन हेडर छवि का निर्माण करता है। अल्फा घटकों की अनदेखी की जाती है।
सेटकोलर के साथ मेरे परीक्षण से पता चलता है कि अल्फा घटकों को अनदेखा नहीं किया गया है; इसके बजाय, वे अभी भी हरियाली प्रदान करते हैं। उच्च अल्फा मान एक पिक्सेल सफेद रंग में बदल जाते हैं। निचले अल्फा मान अधिसूचना क्षेत्र में पृष्ठभूमि रंग (मेरे डिवाइस पर काला) या पुल-डाउन अधिसूचना में निर्दिष्ट रंग के लिए एक पिक्सेल चालू करते हैं। (ऐसा लगता है कि दूसरों ने थोड़ा अलग व्यवहार की सूचना दी है, इसलिए जागरूक रहें!)
पोस्ट एंड्रॉइड लॉलीपॉप रिलीज़ एंड्रॉइड ने अधिसूचना बार में अधिसूचना आइकन प्रदर्शित करने के लिए दिशानिर्देशों को बदल दिया है। आधिकारिक दस्तावेज कहता है "रंग शामिल करने वाली संपत्तियों को अपडेट करें या हटाएं। सिस्टम सभी गैर-अल्फा चैनलों को एक्शन आइकन और मुख्य अधिसूचना आइकन में अनदेखा करता है। आपको यह मानना चाहिए कि ये आइकन अल्फा-ओनली होंगे। सिस्टम सफेद रंग में अधिसूचना आइकन बनाता है। और एक्शन आइकन डार्क ग्रे में। " अब आदमी के शब्दों का अर्थ क्या है "उस छवि के सभी भागों को रूपांतरित करें जिसे आप पारदर्शी पिक्सेल में नहीं दिखाना चाहते हैं। सभी रंग और गैर पारदर्शी पिक्सेल सफेद रंग में प्रदर्शित होते हैं "
आप इसे स्क्रीनशॉट के साथ विस्तार से यहां कैसे देख सकते हैं https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
उम्मीद है की वो मदद करदे
आपको एकल रंग पारदर्शी PNG छवि आयात करने की आवश्यकता है। तो आप छोटे आइकन का आइकन रंग सेट कर सकते हैं। अन्यथा इसे कुछ उपकरणों जैसे मोटो में सफेद दिखाया जाएगा
यदि आप GoogleFireBaseMessaging का उपयोग कर रहे हैं, तो आप "अधिसूचना" पेलोड में "आइकन आईडी" सेट कर सकते हैं (यह सफेद बार आइकन समस्या को हल करने में मेरी मदद करता है):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
R.drawable से अपनी खुद की आईडी के लिए ic_notification सेट करें।
मुझे इसमें बहुत अधिक समस्या का सामना करना पड़ा, लेकिन पूरे इंटरनेट पर खोज करने के बाद मुझे इस मुद्दे के लिए अलग-अलग समाधान मिले। मुझे सभी समाधानों का सारांश दें:
नोट: यह समाधान Phonegap कॉर्डोवा उपयोगकर्ताओं के लिए है
<preference name="android-targetSdkVersion" value="20"/>
आपको अपना Android-targetSdkVersion मान 21 से कम पर सेट करने की आवश्यकता है। इसलिए इस मान को सेट करने के बाद अधिसूचना आइकन छवि Android 6 (Marshmallow) तक दिखाई देगी, यह Android 7 (Nougat) में काम नहीं करेगा। इस समाधान ने मेरे लिए काम किया।
<preference name="StatusBarStyle" value="lightcontent" />
लेकिन यह समाधान केवल तभी काम करेगा जब आपका ऐप खोला जाएगा। इसलिए, मुझे लगता है कि यह समाधान सबसे अच्छा समाधान नहीं है, लेकिन यह कई उपयोगकर्ताओं के लिए काम करता है।
और मुझे यकीन है कि उपरोक्त समाधान में से एक आपके मुद्दे के लिए काम करेगा।
मुझे लगता है कि एपीआई 21 के बारे में बात करने में बहुत देर हो चुकी है, लेकिन मुझे एक आसान तरीका मिल गया है।
'कस्टम अधिसूचना (कस्टम लेआउट) का उपयोग करते समय,
RemoteView के
setImageViewResource(int viewId, int srcId);
तथा
setImageViewUri(int viewId, Uri uri);
लॉलीपॉप (एपीआई 21) पर उन छवि को सफेद बनाता है।
लेकिन उपयोग करते समय
setImageViewBitmap(int viewId, Bitmap bitmap);
छवि सफेद नकाबपोश नहीं बन जाती है!
प्रलेखन के अनुसार, नोटिफिकेशन आइकन Android 3.0 (API Level 11) के बाद से सफेद होना चाहिए :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
"स्टेटस बार आइकन एक पारदर्शी बैकड्रॉप पर बस सफ़ेद पिक्सेल से बने होते हैं, जहाँ चिकनी किनारों और आंतरिक बनावट के लिए अल्फा ब्लेंडिंग का उपयोग किया जाता है, जहाँ उपयुक्त हो।"
इन दो चीजों को ऐप में मिलाएं
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"
यह होना चाहिए < 21
।