# Android 版本适配重点
其他细节请查看官网对应版本:https://developer.android.com/preview
## 7.0
1. 后台优化
- 移除了以下静态注册广播通知(动态注册可继续使用):CONNECTIVITY_ACTION ACTION_NEW_PICTURE ACTION_NEW_VIDEO
2. 系统权限更改
- Android 7.0 或更高版本的应用私有目录被限制访问,传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider,并授予 URI 临时访问权限
- DownloadManager 不再按文件名分享私人存储的文件。旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能出现无法访问的路径。面向 Android 7.0 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException。通过使用 DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 将下载位置设置为公共位置的旧版应用仍可以访问 COLUMN_LOCAL_FILENAME 中的路径,但是我们强烈反对使用这种方法。对于由 DownloadManager 公开的文件,首选的访问方式是使用ContentResolver.openFileDescriptor()。
file:// 类型的Uri无法使用,需要使用FileProvider转换
3. 多窗口模式
3.1 适配多窗口模式
https://developer.android.com/guide/topics/ui/multi-window?hl=zh_cn
3.2 关闭多窗口模式
在清单的 activity 或 application 元素中设置此属性,以启用或停用多窗口显示:
```html
android:resizeableActivity=["true" | "false"]
```
## 8.0
1. 后台执行限制
- 尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException
应使用startForegroundService函数,并且应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数
2. 应用快捷键
https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=zh-cn#as
3. 通知
针对 8.0 的应用,创建通知前需要创建渠道,创建通知时需要传入 channelId,否则通知将不会显示
4. 升级
针对 8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级
5. 桌面图标(不强制,但是桌面图片显示会有白底)
https://mp.weixin.qq.com/s/WxgHJ1stBjokPi6lTUd1Mg
6. 广播
移除所有为隐式广播 Intent 注册的广播接收器,改为动态注册
7. 安装apk
需要增加权限
```html
```
## 9.0
1. 前台服务
应用以 Android 9 或更高版本为目标平台并使用前台服务,则必须请求 FOREGROUND_SERVICE 权限,系统会自动为请求权限的应用授予此权限,如果不请求 FOREGROUND_SERVICE权限将会报错,Manifest加入:
```html
```
2. 网络
使用https或者加入配置项android:networkSecurityConfig
3. Apache HTTP 客户端弃用
所以要想继续使用Apache HTTP,需要在应用的 AndroidManifest.xml 文件中添加
```html
```
4. 启动Activity
不能直接非 Activity 环境中(比如Service,Application)启动 Activity,否则会崩溃报错,需要Intent 中添加标志FLAG_ACTIVITY_NEW_TASK
## 10
1. 禁止后台启动Activity
使用通知触发,需要在AndroidManifest上增加权限USE_FULL_SCREEN_INTENT申明
2. 设备硬件信息读取限制,AndroidId,IMEI不可获取
3. Scope Store
可以使用以下配置停用分区存储
- 如果targetSdkVersion < 29,那么不用处理
- 如果targetSdkVersion >= 29,加入一下配置
```html
Android 10 or higher. -->
...
```
使用分区存储,如果不需要访问其他应用的公开文件,则不需要申请读写权限READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE
- 内部存储
可使用原有File API访问方式
- 外部存储
1. 外部公开目录
可供其他应用和用户自由访问的文件,卸载您的应用后,这些文件应该仍然可供用户使用
只有通过MediaStore API或者SAF(可在任意目录下新建文件,但是是通过用户交互方式),并且限制目录只能为媒体文件或者下载目录,无法使用File API访问
- 如果要保存照片、音频文件或视频剪辑,请使用 MediaStore API
- 如果要保存任何其他文件(如 PDF 文档),请使用 ACTION_CREATE_DOCUMENT intent,这是存储访问框架(SAF的一部分。此操作会调起系统UI界面
2. 外部私有目录
使用getExternalFilesDir()函数访问,后续操作可使用File API
卸载应用时会被清除,调用 getExternalFilesDir() 并传入指明您想要的目录类型的名称来获取特定于应用的目录,或调用getExternalFilesDir()传入自定义文件夹名称
```kotlin
//固定图片目录
getExternalFilesDir(DIRECTORY_PICTURES)
//自定义目录
getExternalFilesDir("myDir")
```
4. 后台定位权限
需要ACCESS_BACKGROUND_LOCATION权限
5. 限制使用非SDK接口
网友评论