最近代碼君在測試公司的項目時候,發(fā)現(xiàn)項目在Android 8.0機型上運行的時候,版本更新功能會出現(xiàn)異常,啟動下載的時候Android通知欄報錯 : Failed to post notification on channel "null",根據(jù)字面意思應(yīng)該是Notification中的channel為空
Notification Channels 是什么
這個是從Android 8.0 引入的概念,目的是提供統(tǒng)一的系統(tǒng)來幫助用戶管理通知药薯,開發(fā)者可以為需要發(fā)送的每個不同的通知類型創(chuàng)建一個通知渠道。還可以創(chuàng)建通知渠道來反映應(yīng)用的用戶做出的選擇救斑。例如童本,可以為聊天應(yīng)用的用戶創(chuàng)建的每個聊天組建立單獨的通知渠道。
Android 8.0 的用戶可以使用一致的系統(tǒng) UI 管理大多數(shù)與通知有關(guān)的設(shè)置脸候,用過iPhone的就可以很好理解這個功能穷娱,就是以后Android的app,不能隨意提示通知欄啦运沦,用戶可以設(shè)置消息在鎖屏上顯示泵额、免打擾、消息震動提示携添、聲音提示等嫁盲,換句話說如果用戶禁止在通知欄提示,那么apk就無法在通知欄提示了烈掠,這點對于Android用戶來說是好事羞秤,省的一些app亂用權(quán)限,給用戶一直彈消息
如何使用Notification Channels
一左敌、創(chuàng)建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel mChannel = new NotificationChannel("channel_01",
"消息推送", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(mChannel);
}
NotificationChannel 方法有三個參數(shù)channel_id瘾蛋、channel_name、channel_importce,這幾個參數(shù)的代表的是channel的ID母谎,名字以及消息的重要等級瘦黑,id和name都可以誰便起京革,id保證唯一就好奇唤,重要等級代碼君就填寫默認的啦
二、創(chuàng)建完channel匹摇,調(diào)用Notification.Builder.build()
Context context = DJApplication.getInstance();
Notification.Builder builder = new Notification.Builder(context);
builder.setTicker("開始下載");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(DJApplication.getInstance().getResources(), R.mipmap.ic_launcher));
builder.setAutoCancel(true);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentTitle("下載中");
builder.setContentIntent(pIntent);
builder.setContentText(text);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId("channel_01");
}
manager.notify(1, builder.build());
builder.setChannelId 設(shè)置有效的通知渠道 ID咬扇,這個ID要和之前創(chuàng)建時候的Channel_ID相同,運行之后就不好報上面的錯誤啦
Android 8.0 安裝權(quán)限問題
版本更新后,正常是需要通過Intent廊勃,調(diào)用apk文件路徑懈贺,進行自動安裝的经窖,但是8.0 下載完文件,并沒有調(diào)用成功梭灿,bug排查之后發(fā)現(xiàn)的問題是:
在 Android 8.0 中画侣,安裝未知應(yīng)用權(quán)限提高了安裝未知來源應(yīng)用時的安全性。此權(quán)限與其他運行時權(quán)限一樣堡妒,會與應(yīng)用綁定配乱,在安裝時進行提示,確保用戶授予使用安裝來源的權(quán)限后皮迟,此權(quán)限才會提示用戶安裝應(yīng)用搬泥。在運行 Android 8.0 或更高版本的設(shè)備上使用此權(quán)限時,惡意下載程序?qū)o法騙取用戶安裝未獲得預(yù)先授權(quán)的應(yīng)用伏尼,所以我們需要加入安裝apk文件的權(quán)限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
總結(jié)
目前發(fā)現(xiàn)Android 8.0 的坑就這些忿檩,如果讀者發(fā)現(xiàn)有其他8.0 的坑,或者遇到8.0 的坑爆阶,歡迎留言交流