目前记录从Android5.0开始,放弃Android4.4的适配
Android6.0
运行时权限
危险权限列表:developer.android.google.cn/guide/topic…
-
向清单添加权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.snazzyapp"> <uses-permission android:name="android.permission.INTERNET"/> <!-- other permissions go here --> <application ...> ... </application> </manifest> -
检查权限
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted } -
申请权限
// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed; request the permission ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } else { // Permission has already been granted }
Android7.0
在应用间共享文件
为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问
-
指定
FileProvider<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest> -
指定共享目录
<paths> <files-path path="images/" name="myimages" /> </paths>
Android8.0
后台执行限制
在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。 Android 8.0 有一项复杂功能:系统不允许后台应用创建后台 Service。 因此,Android 8.0 引入了一种全新的方法,即 startForegroundService(),以在前台启动新 Service。 在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内未调用 startForeground(),则系统将停止此 Service 并声明此应用为 ANR
广播限制
无法注册隐式广播
标识
AndroidID规则与之前不同
注意
全屏固定方向activity报错(Android9.0修复),不固定方向或透明
Android9.0
前台服务
如果应用以 Android 9 或更高版本为目标平台并使用前台服务,则必须请求 FOREGROUND_SERVICE 权限。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
标识
在 Android 9 中,Build.SERIAL 始终设为 "UNKNOWN",以保护用户隐私。
如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE 权限,然后调用 getSerial()。
https
默认不允许使用http接口,在清单文件中cleartextTrafficPermitted 设置为 true
Android10
隐私权变更
| 受影响的应用 | 缓解策略 | |
|---|---|---|
| 分区存储 针对外部存储的过滤视图,可提供对特定于应用的文件和媒体集合的访问权限 | 访问和共享外部存储中的文件的应用 | 使用特定于应用的目录和媒体集合目录 了解详情 |
| 增强了用户对位置权限的控制力 仅限前台权限,可让用户更好地控制应用对设备位置信息的访问权限 | 在后台时请求访问用户位置信息的应用 | 确保在没有后台位置信息更新的情况下优雅降级 使用 Android 10 中引入的权限在后台获取位置信息 了解详情 |
| 系统执行后台 Activity 针对从后台启动 Activity 实施了限制 | 不需要用户互动就启动 Activity 的应用 | 使用通知触发的 Activity 了解详情 |
| 不可重置的硬件标识符 针对访问设备序列号和 IMEI 实施了限制 | 访问设备序列号或 IMEI 的应用 | 使用用户可以重置的标识符 了解详情 |
| 无线扫描权限 访问某些 WLAN、WLAN 感知和蓝牙扫描方法需要获得精确位置权限 | 使用 WLAN API 和蓝牙 API 的应用 | 针对相关使用场景请求 ACCESS_FINE_LOCATION 权限 了解详情 |
分区存储
使用分区存储的应用对自己创建的文件始终拥有读/写权限,无论文件是否位于应用的专有目录内。因此,如果您的应用仅保存和访问自己创建的文件,则无需请求获得 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 权限。
不过,若要访问其他应用创建的文件,则必须满足以下两个条件:
- 您的应用已获得
READ_EXTERNAL_STORAGE权限。 - 这些文件位于以下其中一个明确定义的媒体集合中:
- 照片:存储在
MediaStore.Images中。 - 视频:存储在
MediaStore.Video中。 - 音频文件:存储在
MediaStore.Audio中。
- 照片:存储在
为了访问其他应用创建的任何其他文件(包括“downloads”目录下的文件),您的应用必须使用存储访问框架,该框架允许用户选择特定文件。
如果此类应用要访问外部存储设备的原始文件系统视图,则即使拥有 READ_EXTERNAL_STORAGE 权限,也只能访问应用专有的目录。如果应用尝试通过原始文件系统视图打开此目录之外的文件,则会发生错误:
- 在托管代码中,会发生
FileNotFoundException错误。 - 在原生代码中,会发生
EPERM内核错误。
注意:使用分区存储的应用对于 /sdcard/DCIM/IMG1024.JPG 这类路径不具有直接内核访问权限。要访问此类文件,应用必须使用 MediaStore,并调用 openFile() 等方法。
媒体数据限制
分区存储会施加以下媒体数据限制:
- 若您的应用未获得
ACCESS_MEDIA_LOCATION权限,照片文件中的 Exif 元数据会被修改。要了解详情,请参阅介绍如何访问照片中的位置信息的部分。 MediaStore.Files表格本身会经过过滤,仅显示照片、视频和音频文件。例如,表格中不显示 PDF 文件。- 必须使用
MediaStore在 Java 或 Kotlin 代码中访问媒体文件。请参阅有关如何从原生代码访问媒体文件的指南。
该指南介绍了如何处理媒体文件,并提供了有关访问 MediaStore 内的单个文档和文档树的最佳做法。如果您的应用使用分区存储,则需要使用这些方法来访问媒体。
不可重置标识
使用国家统一标识OAID
www.msa-alliance.cn/