targetSdkVersion22升级至29 关注点
Android 6.0 (API 23 )变更
Android 7.0 (API 24 )变更
Android 8.0 (API 26 )变更
Android 9.0 (API 28 )变更
Android 10 (API 29 )变更
1、权限相关
一、危险权限
-
文件管理权限(android.permission.MANAGE_EXTERNAL_STORAG)
需要 Android 11 及以上
-
安装应用权限(android.permission.REQUEST_INSTALL_PACKAGES)
需要 Android 8.0 及以上。Android 11 特性调整,安装外部来源应用需要重启 App:https://cloud.tencent.com/developer/news/637591
-
通知栏权限(android.permission.NOTIFICATION_SERVICE)
需要 Android 6.0 及以上,注意此权限不需要在清单文件中注册也能申请
-
悬浮窗权限(android.permission.SYSTEM_ALERT_WINDOW)
需要 Android 6.0 及以上。 在 Android 10 及之前的版本能跳转到应用悬浮窗设置页面,而在 Android 11 及之后的版本只能跳转到系统设置悬浮窗管理列表了。具体详情请看官方文档解释:https://developer.android.google.cn/reference/android/provider/Settings#ACTION_MANAGE_OVERLAY_PERMISSION
-
系统设置权限(android.permission.WRITE_SETTINGS)
需要 Android 6.0 及以上
二、运行时权限
正常申请即可。
三、普通权限
在应用的清单文件中请求即可
2、过时方法
targetSdkVersion >= 29,Environment.getExternalStorageDirectory()方法过时,不推荐使用。
推荐使用 Context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
如果项目中已使用,须在AndroidMainfest的application中添加下面一段代码
android:requestLegacyExternalStorage="true"
3、API 28+ 之后限制http请求,必须用https
解决方案:创建个network_security_config.xml文件,添加以下代码。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
在androidMainfest中配置在application中
<application
android:networkSecurityConfig="@xml/network_security_config">
4、在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode
API 政策禁止在您的应用外部公开 file://
URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException
异常。
要在应用间共享文件,您应发送一项 content://
URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider
类。
比如请求拍照并保存到本地时:
-
在清单文件下注册
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.xh.tea_app.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
-
res/xml/provider_paths类
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> // 文件夹目录/storage/emulated/0/xuehai/Image/camera/简写xuehai/Image/camera/ <external-path name="image_files_path" path="xuehai/Image/camera/"/> </paths>
-
在代码中将Uri.fromFile替换
Uri imageUri; // Android 7.0以前的方式 imageUri = Uri.fromFile(cameraFile); // Android 7.0以上的方式. // com.xh.tea_app.provider需要和清单文件中定义的provider保持一致 imageUri = FileProvider.getUriForFile(this, "com.xh.tea_app.provider", cameraFile); grantUriPermission(getPackageName(), imageUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
网友评论