1. 程式人生 > >安卓5.0通知遇到的問題及原因

安卓5.0通知遇到的問題及原因

首先是傳送普通通知的一段程式碼。

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);
	}
	

在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);
	}

以上列舉了常用的通知設定介紹。

如果你按照上面的進行了修改,結果成功,那麼恭喜你!,如果你發現沒有效果,那麼只能說點背(我就是)。

問題出在了哪裡?

其實程式碼方面沒有任何問題,只是現在國產手機都有自己的定製化UI,在我的手上有兩款手機,一款是華為的EMUI,一款是樂視的

EUI。這兩個對於通知都有自己的管理,基本的管理有優先順序、是否允許、是否懸浮顯示通知。如下圖:


所以在上面的程式碼中,設定通知優先順序、懸浮、顯示的許可權(不受鎖屏限制)等這些設定會無效。

這些的實現需要使用者自己在設定裡進行管理設定。

甚至在樂視的手機上,設定的小圖,大圖都會失效。最後發現樂視的EUI會對常用的app(qq,微信等)進行適配在UI中提供小圖。

(例如美團在華為的顯示正常,但是樂視就。。)

最後再說說小圖的尺寸:

mdpi @ 24.00dp = 24.00px 
hdpi @ 24.00dp = 36.00px 
xhdpi @ 24.00dp = 48.00px

xxhdpi @ 24.00dp = 72.00px