Android targetSdkVersion 23 升级 26 遇到的坑

1.运行时申请权限问题

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。

对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。

总结:

  1. 以前,申请一个子权限会自动获取权限组中其他子权限。组内其他子权限可以直接使用。
  2. 现在,申请一个子权限,组内其他子权限不会自动获取。使用组内其他子权限的时候。需要再次申请。(但是这种情况不会弹出系统的权限申请框)如果不申请。会FC。

修改建议

     同组权限一起申请。当我们申请权限时。申请同组的多个权限时,也只会弹出一次申请框。所以不如一起申请。

     比如申请存储权限READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,

             如果不需要修改删除只申请READ_EXTERNAL_STORAGE权限即可,

             如果都需要最好申请WRITE_EXTERNAL_STORAGE,然后再申请READ_EXTERNAL_STORAGE。

参考:https://www.jianshu.com/p/47a992fe064d?utm_source=oschina-app

2.通知栏不显示问题

Android8.0之后,引入了通知渠道

简单写法就是:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        String channelId = "download";
        String channelName = "下载课程";
        NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW);
        NotificationManager manager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
        manager.createNotificationChannel(channel);
        remoteViews = new RemoteViews(activity.getPackageName(), R.layout.notification_download);
        RemoteViews remoteViews.setTextViewText(R.id.content_title, describe);
        remoteViews.setProgressBar(R.id.progress, 100, 0, false);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(activity, channelId);
        builder.setContent(remoteViews)
               .setSmallIcon(R.mipmap.logo)
               .setAutoCancel(true);
        Notification notification = builder.build();
        builder.setPublicVersion(notification);
        manager.notify(id, notification);
}

参考:https://www.jianshu.com/p/cb8426620e74

3.下载文件无法打开问题

升级之后Android 7.0以上打开已下载的文件会导致崩溃,报错:android.os.FileUriExposedException: file:///storage/emulated/0/goots/replay/file/3timhg.jpg exposed beyond app through Intent.getData()

官方解释:

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

官方给出的解决方法就是使用FileProvider

具体实现方式就看洋神的文章就可以了

吹一波洋神的文,逻辑清晰,文章整洁,基本上你想问的他都有注释或在文里有解释,只要认真阅读就一定会用的那种,只要跟着做基本不会错,而且基本都会有相应的demo做参考阅读

参考:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823231&idx=1&sn=650093dfbdb04da12f2595f3f54676a9&chksm=80b78ea1b7c007b7dd5a628dc324b6150a801b7209c9cbf3900e7f5930471f3b5177c3761195&scene=38#wechat_redirect

当将Android项目的`targetSdkVersion`升级Android 11 (API级别30)及以上时,可能会遇到与`ConstraintLayout`相关的错误,这是因为新版本的系统对布局组件的行为进行了调整,尤其是在处理视图约束(Constraints)上。 在Android 11中,Google引入了一些新的变化,比如View Binding API,这可能导致之前基于旧版SDK使用的依赖库或XML约束配置不再适用。当你尝试运行应用时,`ConstraintLayout`可能会抛出关于`Constraints`解析或支持的问题,例如找不到视图、约束冲突等。 解决这个问题通常需要做以下步骤: 1. **检查约束设置**:确保你的`ConstraintLayout` XML文件里的约束(如`app:layout_constraint*`属性)已经适应了最新的约束语法,特别是在使用`androidx.constraintlayout.widget.ConstraintLayout`而不是旧版`com.android.support.constraint.ConstraintLayout`。 2. **更新依赖**:如果你正在使用第三方库,确认其是否支持Android 11以上的版本,并将其更新到最新版本。 3. **启用View Binding**:如果尚未启用,可以在`build.gradle`文件中添加`implementation 'androidx.databinding:viewbinding:4.1.0'`并创建对应的`ViewModel`绑定类。 4. **检查并修复错误**:运行应用,查看错误日志,找出具体的错误提示,根据它提供的信息修改布局或代码。 5. **测试兼容**:在模拟器和真机上分别测试,确保在所有目标API级别上都能正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值