Android 8.0系統(tǒng)更新之后,app的更新將不再像之前的系統(tǒng)版本一樣能夠直接下載安裝包之后直接安裝(以前安裝未知來源應(yīng)用的時候一般會彈出一個彈窗讓用戶去設(shè)置允許還是拒絕堵未,并且設(shè)置為允許之后,所有的未知來源的應(yīng)用都可以被安裝)院峡,8.0需要用戶給予允許app安裝未知來源應(yīng)用的權(quán)限(比如你的app 名字為A嚎莉,當(dāng)你需要更新時关拒,則需要使用app的用戶 授權(quán)A這個app 允許安裝未知來源的權(quán)限,才能完成正常的更新操作)蝉揍。
Android8.0的變化是链峭,未知應(yīng)用安裝權(quán)限的開關(guān)被除掉,取而代之的是未知來源應(yīng)用的管理列表又沾,需要在里面打開每個應(yīng)用的未知來源的安裝權(quán)限(說實話弊仪,這個權(quán)限要找到還真的不是那么容易,我第一次就找了半天才找到杖刷。励饵。也是尷尬)。Google這么做是為了防止一開始正經(jīng)的應(yīng)用后來開始通過升級來做一些不合法的事情滑燃,侵犯用戶權(quán)益役听。當(dāng)你的應(yīng)用直接適配到Android8之后,內(nèi)部啟動應(yīng)用安裝是會被阻塞的,如果不處理好這個未知來源的權(quán)限典予,會導(dǎo)致應(yīng)用根本無法更新甜滨,只能去應(yīng)用市場重新下載。瘤袖。那么該怎么做這個權(quán)限適配呢?
首先第一步:我們需要在清單文件中添加一項權(quán)限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
有了這個權(quán)限之后衣摩,其實在更新時,當(dāng)更新包下載完成后捂敌,系統(tǒng)會彈出權(quán)限申請的選擇框艾扮,用戶點擊允許的話是可以正常安裝的。
但是我們最好還是在代碼中進(jìn)一步進(jìn)行動態(tài)權(quán)限處理黍匾。
先來判斷當(dāng)前的sdk是否是8.0及以上的版本
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//如果是 則判斷當(dāng)前是否有權(quán)限
haveInstallPermission = getPackageManager().canRequestPackageInstalls();
//沒有權(quán)限則進(jìn)行權(quán)限請求
if (!haveInstallPermission) {
//請求權(quán)限可以用兩種方法栏渺,選中合適的就好
// A呛梆。第一種 直接通過意圖 進(jìn)入設(shè)置界面锐涯,讓用戶清晰的知道設(shè)置的位置,手動的打開設(shè)置開關(guān)
//打開設(shè)置——允許安裝未知來源的應(yīng)用
@RequiresApi(api = Build.VERSION_CODES.O)
private void startInstallPermissionSettingActivity() {
//注意這個是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
startActivityForResult(intent, 10086);
}
使用這種方法則需要在onActivityResult方法中進(jìn)行回調(diào)處理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 10086) {
installProcess();//再次執(zhí)行安裝流程填物,包含權(quán)限判等
}
}
// B纹腌。第二種 直接進(jìn)行權(quán)限請求
//請求安裝未知應(yīng)用來源的權(quán)限
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 200);
然后在onRequestPermissionsResult處理
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//處理邏輯
} } }
這樣 更新適配就做好了。
8.0也需要做通知欄的適配滞磺,比如說更新的進(jìn)度條需要顯示在通知欄讓用戶查看升薯,那么在8.0之后的系統(tǒng)就需要進(jìn)行通知欄的適配。
方法如下:
//如果當(dāng)前系統(tǒng)是8.0以上的击困,則需要使用新的通知創(chuàng)建方法來適配
@RequiresApi(api = Build.VERSION_CODES.O)
private void showChannel1Notification(){
notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//創(chuàng)建 通知通道 channelid和channelname是必須的(自己命名就好)
NotificationChannel channel = new NotificationChannel("1",
"Channel1", NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(true);//是否在桌面icon右上角展示小紅點
channel.setLightColor(Color.GREEN);//小紅點顏色
channel.setShowBadge(true); //是否在久按桌面圖標(biāo)時顯示此渠道的通知
notificationManager.createNotificationChannel(channel);
int notificationId = 0x1234;
Notification.Builder builder = new Notification.Builder(context,"1");
//設(shè)置通知顯示圖標(biāo)涎劈、文字等
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("正在下載新版本,請稍后...")
.setAutoCancel(true);
notification=builder.build();
notificationManager.notify(notificationId,notification);
//設(shè)置下載進(jìn)度條
if (view == null) {
view = new RemoteViews(getPackageName(), R.layout.notification);
notification.contentView = view;
notification.contentView.setProgressBar(R.id.progress, 100, 0, false);
}
//延遲意圖
PendingIntent contentIntent = PendingIntent.getActivity(this, R.string.app_name, new Intent(),
PendingIntent.FLAG_UPDATE_CURRENT);
notification.contentIntent = contentIntent;
notification.flags |= Notification.FLAG_ONGOING_EVENT;// 滑動或者clear都不會清空
}
這樣就會在8.0系統(tǒng)上彈出通知了阅茶。當(dāng)然還需要及時的關(guān)閉通知蛛枚,當(dāng)更新進(jìn)度條加載完成或者其他時候
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//關(guān)閉通知通道
notificationManager.deleteNotificationChannel("1");
}
及時關(guān)閉。
到此8.0的更新和通知欄適配就完成啦脸哀,如果有什么不對的或者不懂的歡迎留言呦蹦浦!
關(guān)于刷新進(jìn)度條會出現(xiàn)多次聲音的情況,是每次進(jìn)度條刷新時都會發(fā)送一個通知撞蜂,通過這個通知來達(dá)到更新進(jìn)度條進(jìn)度值的目的盲镶,發(fā)通知時就會有通知音。解決這個辦法一個是可以設(shè)置提醒標(biāo)志符Flags蝌诡;實例化通知欄之后通過給他添加.flags屬性賦值溉贿。
notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;這個flags代表發(fā)起Notification后,鈴聲和震動均只執(zhí)行一次浦旱。另一個方法是@喝風(fēng)娃在上方評論中提及到的setOnlyAlertOnce設(shè)置其為true宇色,大家可以這么來解決,后續(xù)要是發(fā)現(xiàn)啥問題,希望大家來評論席多反饋哈代兵,咱們一起學(xué)習(xí)