Android O 8.0及其以上系統(tǒng)的通知(Notification)、安裝apk問題更新后的簡單兼容寫法

最近時間在做Android8.0及其以上系統(tǒng)下App版本更新時,使用Android 8.0的手機測試發(fā)現(xiàn)兩個問題:

1.彈出通知欄沒有展示,Toast:Developer warning for package “xxx.xxx.xxx” Failed to post notification on channel “null” See log for more details

2.新安裝包下載完成之后,沒有自動跳轉到安裝界面,使用8.0以下的手機并沒有這個問題。

針對問題1:

查閱官方文檔得知,NotificationChannel是android8.0新增的特性,如果App的targetSDKVersion>=26,沒有設置channel通知渠道的話,就會導致通知無法展示。

Android O 引入了 通知渠道(Notification Channels),以提供統(tǒng)一的系統(tǒng)來幫助用戶管理通知,如果是針對 android O 為目標平臺時,必須實現(xiàn)一個或者多個通知渠道,以向用戶顯示通知。比如聊天軟件,為每個聊天組設置一個通知渠道,指定特定聲音、燈光等配置。

因此解決方案是給通知設置渠道 createNotification(). 具體設置渠道的代碼如下:

final NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notift_item);
//適配安卓8.0的消息渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      /**
       * Oreo不用Priority了,用importance
       * IMPORTANCE_NONE 關閉通知
       * IMPORTANCE_MIN 開啟通知,不會彈出,但沒有提示音,狀態(tài)欄中無顯示
       * IMPORTANCE_LOW 開啟通知,不會彈出,不發(fā)出提示音,狀態(tài)欄中顯示
       * IMPORTANCE_DEFAULT 開啟通知,不會彈出,發(fā)出提示音,狀態(tài)欄中顯示
       * IMPORTANCE_HIGH 開啟通知,會彈出,發(fā)出提示音,狀態(tài)欄中顯示
       */
      NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_LOW);
      manager.createNotificationChannel(channel);
    }
notification = new NotificationCompat.Builder(this).setContent(view)
.setTicker("正在下載") //通知首次出現(xiàn)在通知欄,帶上升動畫效果的
.setOngoing(true)//設置他為一個正在進行的通知。他們通常是用來表示一個后臺任務,用戶積極參與(如播放音樂) 或以某種方式正在等待,因此占用設備(如一個文件下載,同步操作,主動網(wǎng)絡連接)
.setSmallIcon(R.mipmap.jycicon)//設置通知小ICON
.setContentTitle("下載中")//設置通知欄標題
.setContentText("正在下載請稍等")//設置通知欄顯示內容
.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL))//設置通知欄點擊意圖
.setChannelId(channelID)
.build();

此時,推送通知,不再有上面的錯誤提示,同時可以看到頂部有通知正常彈出。

上面代碼是針對android8.0,因此還要在重寫的方法上面加上@RequiresApi(api =26)。
針對問題2:
Android 8.0 Oreo 中,Google 移除掉了容易被濫用的“允許位置來源”應用的開關,在安裝 Play Store 之外的第三方來源的 Android 應用的時候,已經(jīng)沒有了“允許未知來源”的檢查框,其實并不是沒有這個檢查框了,只是放在了apk安裝的界面,如果你還是想要安裝某個被自己所信任的開發(fā)者的 app,則需要在清單文件AndroidManifest中加上如下權限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

然后再Android上8.0的機器上運行,發(fā)現(xiàn)新的apk下載完成后可以自動跳到安裝界面,這時“允許安裝未知來源”的檢查框出現(xiàn)了。點擊允許apk就可以順利安裝了。

這時你是否會想就加一個權限就可以了,so easy!我們可以做如下操作讓我們的App更加完美。

/** * 判斷是否是8.0,8.0需要處理未知應用來源權限問題,否則直接安裝 */ 
        private void checkIsAndroidO() { 
               if (Build.VERSION.SDK_INT >= 26) { 
                             boolean b = getPackageManager().canRequestPackageInstalls(); 
                             if (b) { 
                                 installApk();//安裝應用的邏輯(寫自己的就可以) 
                                 } else { 
                                          //請求安裝未知應用來源的權限 
                                         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);} 
                    } else { 
                            installApk(); 
                        } 
           } 

以上代碼可以放在首次進入app時申請動態(tài)權限。

首次進行版本更新時,我們得到的應該是false,因為系統(tǒng)默認并沒有允許該權限。我們可以請求該權限,在權限請求結果的回調中處理邏輯如下:

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
switch (requestCode) {   
case INSTALL_PACKAGES_REQUESTCODE:     
if (grantResults.length > 0 && grantResults[0]==                             PackageManager.PERMISSION_GRANTED) {
       installApk();
    } else {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {//2.3
          localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
          localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
        } else if (Build.VERSION.SDK_INT <= 8) {//2.2
          localIntent.setAction(Intent.ACTION_VIEW);
         localIntent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
          localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
        }
        context.startActivity(localIntent);
      }
      break;
  }
}

若是沒有獲得該權限,我們可以使用else里的操作將用戶引導至應用信息界面,設置權限、允許安裝未知來源,如圖

image

?
image

做了如上操作后,用戶下次版本更新的時候,已經(jīng)允許了未知來源的應用,就可以直接安裝了,無需用戶再手動授權允許!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • APK安裝流程系列文章整體內容如下: APK安裝流程詳解0——前言APK安裝流程詳解1——有關"安裝ing"的實體...
    隔壁老李頭閱讀 9,424評論 4 15
  • 一、簡介二、效果預覽?三、實現(xiàn)步驟四、功能解析五、Demo地址六、內容推薦 一、簡介 嘿嘿,這周沒缺席,繼續(xù)給大伙...
    斌林誠上閱讀 6,360評論 1 15
  • 最近在做8.0以及P版本的是適配,對安卓的行為變更,對企業(yè)項目的影響做了簡單的整理 Android 8.0 行為變...
    撒嬌的喵咪閱讀 2,362評論 0 9
  • 突然天陰沉,我不自覺地哼起了小調,哼著哼著有了口腔里的發(fā)音,發(fā)的是什么我并不知道,自然流淌。流淌到西北流經(jīng)到北方又...
    金金心閱讀 323評論 0 0
  • 中午出去散步,猛然發(fā)現(xiàn),路邊的梧桐花開了。 這條路從東到西大概有二三十公里,路兩邊種滿了梧桐樹。每年春天梧桐花開的...
    菁菁TJ閱讀 1,476評論 6 50

友情鏈接更多精彩內容