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,则系统会立即授予该权限,而不会提示用户。
总结:
- 以前,申请一个子权限会自动获取权限组中其他子权限。组内其他子权限可以直接使用。
- 现在,申请一个子权限,组内其他子权限不会自动获取。使用组内其他子权限的时候。需要再次申请。(但是这种情况不会弹出系统的权限申请框)如果不申请。会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做参考阅读