Android 8.0系统更新之后,app的更新将不再像之前的系统版本一样能够直接下载安装包之后直接安装(以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装),8.0需要用户给予允许app安装未知来源应用的权限(比如你的app 名字为A,当你需要更新时,则需要使用app的用户 授权A这个app 允许安装未知来源的权限,才能完成正常的更新操作)。
Android8.0的变化是,未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要在里面打开每个应用的未知来源的安装权限(说实话,这个权限要找到还真的不是那么容易,我第一次就找了半天才找到。。也是尴尬)。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。当你的应用直接适配到Android8之后,内部启动应用安装是会被阻塞的,如果不处理好这个未知来源的权限,会导致应用根本无法更新,只能去应用市场重新下载。。那么该怎么做这个权限适配呢?
首先第一步:我们需要在清单文件中添加一项权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
有了这个权限之后,其实在更新时,当更新包下载完成后,系统会弹出权限申请的选择框,用户点击允许的话是可以正常安装的。
但是我们最好还是在代码中进一步进行动态权限处理。
先来判断当前的sdk是否是8.0及以上的版本
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//如果是 则判断当前是否有权限
haveInstallPermission = getPackageManager().canRequestPackageInstalls();
//没有权限则进行权限请求
if (!haveInstallPermission) {
//请求权限可以用两种方法,选中合适的就好
// A。第一种 直接通过意图 进入设置界面,让用户清晰的知道设置的位置,手动的打开设置开关
//打开设置——允许安装未知来源的应用
@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方法中进行回调处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 10086) {
installProcess();//再次执行安装流程,包含权限判等
}
}
// B。第二种 直接进行权限请求
//请求安装未知应用来源的权限
// 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也需要做通知栏的适配,比如说更新的进度条需要显示在通知栏让用户查看,那么在8.0之后的系统就需要进行通知栏的适配。
方法如下:
//如果当前系统是8.0以上的,则需要使用新的通知创建方法来适配
@RequiresApi(api = Build.VERSION_CODES.O)
private void showChannel1Notification(){
notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//创建 通知通道 channelid和channelname是必须的(自己命名就好)
NotificationChannel channel = new NotificationChannel("1",
"Channel1", NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(true);//是否在桌面icon右上角展示小红点
channel.setLightColor(Color.GREEN);//小红点颜色
channel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
notificationManager.createNotificationChannel(channel);
int notificationId = 0x1234;
Notification.Builder builder = new Notification.Builder(context,"1");
//设置通知显示图标、文字等
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("正在下载新版本,请稍后...")
.setAutoCancel(true);
notification=builder.build();
notificationManager.notify(notificationId,notification);
//设置下载进度条
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系统上弹出通知了。当然还需要及时的关闭通知,当更新进度条加载完成或者其他时候
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//关闭通知通道
notificationManager.deleteNotificationChannel("1");
}
及时关闭。
到此8.0的更新和通知栏适配就完成啦,如果有什么不对的或者不懂的欢迎留言呦!