Android 5.0通知遇到的問題及原因
來自: http://blog.csdn.net/qq_17766199/article/details/49778339
首先是發送普通通知的一段代碼。
public void send(String string) {NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("標題");// 設置通知欄標題 mBuilder.setSmallIcon(R.drawable.ic_launcher);// 設置通知小ICON mBuilder.setContentText(string + "點擊查看。"); mBuilder.setTicker(string); // 通知首次出現在通知欄,帶上升動畫效果的 mBuilder.setWhen(System.currentTimeMillis());// 通知產生的時間,會在通知信息里顯示,一般是系統獲取到的時間 Notification notification = mBuilder.build();//API 16 NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager.notify(1, notification); }</pre> <br />
在Android 5.0以下版本,icon可以正常顯示,但是在5.0以上版本中,icon顯示為白塊。
隨后百度這個問題找到一個網址:點擊打開鏈接
大體意思是在5.0中,對于設計風格有了統一的要求。
引用原文:簡單的說就是5.0后Android官方建議不要為通知的圖標添加任何額外的透明度,漸變色,不要企圖用顏色將通知圖標與其他應用,比如系統應用,應用的通知圖標只能是在透明的背景上有白色的圖案。至于原因,文檔并沒有細說,只是提到5.0系統將會在底層處理圖標,想知怎么處理的可以參考Android SDK API level 21后的Notificaiton源碼,里面寫的較詳細。可以參考:點擊打開鏈接
知道了問題的解決方法后,做了修改。如下(終極版):
public void send(String string) {NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, 0); mBuilder.setContentIntent(pendingIntent);// 設置通知欄點擊意圖 mBuilder.setContentTitle("標題");// 設置通知欄標題 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//懸掛式Notification,5.0后顯示 mBuilder.setContentText(string + "點擊查看。").setFullScreenIntent(pendingIntent, true); mBuilder.setCategory(NotificationCompat.CATEGORY_MESSAGE); mBuilder.setSmallIcon(R.drawable.jingbao1);// 設置通知小ICON(5.0必須采用白色透明圖片) }else{ mBuilder.setSmallIcon(R.drawable.ic_launcher);// 設置通知小ICON mBuilder.setContentText(string ); } mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.jing_6));// 設置通知大ICON mBuilder.setTicker(string + "有警報!"); // 通知首次出現在通知欄,帶上升動畫效果的 mBuilder.setWhen(System.currentTimeMillis());// 通知產生的時間,會在通知信息里顯示,一般是系統獲取到的時間 mBuilder.setPriority(NotificationCompat.PRIORITY_MAX); // 設置該通知優先級 mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);//在任何情況下都顯示,不受鎖屏影響。 mBuilder.setAutoCancel(true);// 設置這個標志當用戶單擊面板就可以讓通知將自動取消 mBuilder.setOngoing(false);// ture,設置他為一個正在進行的通知。他們通常是用來表示一個后臺任務,用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設備(如一個文件下載,同步操作,主動網絡連接) // 向通知添加聲音、閃燈和振動效果的最簡單、最一致的方式是使用當前的用戶默認設置,使用NotificationCompat.DEFAULT_ALL屬性,可以組合 mBuilder.setVibrate(new long[] { 0, 100, 500, 100 });//振動效果需要振動權限 mBuilder.setSound(Uri.parse("android.resource://" + getPackageName()//聲音 + "/" + R.raw.notification_alarm)); mBuilder.setDefaults(NotificationCompat.DEFAULT_LIGHTS);//閃燈 NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //Notification notification = mBuilder.getNotification();//API 11 Notification notification = mBuilder.build();//API 16 mNotificationManager.notify(1, notification); }</pre> <br />
以上列舉了常用的通知設置介紹。
如果你按照上面的進行了修改,結果成功,那么恭喜你!,如果你發現沒有效果,那么只能說點背(我就是)。
問題出在了哪里?
其實代碼方面沒有任何問題,只是現在國產手機都有自己的定制化UI,在我的手上有兩款手機,一款是華為的EMUI,一款是樂視的
EUI。這兩個對于通知都有自己的管理,基本的管理有優先級、是否允許、是否懸浮顯示通知。如下圖:
所以在上面的代碼中,設置通知優先級、懸浮、顯示的權限(不受鎖屏限制)等這些設置會無效。
這些的實現需要用戶自己在設置里進行管理設置。
甚至在樂視的手機上,設置的小圖,大圖都會失效。最后發現樂視的EUI會對常用的app(qq,微信等)進行適配在UI中提供小圖。
(例如美團在華為的顯示正常,但是樂視就。。)
最后再說說小圖的尺寸:
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00pxxxhdpi @ 24.00dp = 72.00px