Android 5.0通知遇到的問題及原因

fpsv9763 8年前發布 | 44K 次閱讀 Android Studio開發工具

來自: 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.00px

xxhdpi @ 24.00dp = 72.00px


 本文由用戶 fpsv9763 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!