其他
Android 11来了,快!扶我起来
https://juejin.im/user/5c07e51de51d451de84324d5
在 Android Studio 中,依次点击 Tools > SDK Manager。 在 SDK Platforms 标签页下,选择窗口底部的 Show Package Details。 在 Android 11 Developer Preview 下,选择系统映像(例如 Google APIs Intel x86 Atom System Image)。 在 SDK Tools 标签页中,选择最新版 Android 模拟器,点击 OK 开始安装。 安装完成后,依次选择 Tools > AVD Manager,然后按照说明创建新的 AVD(https://developer.android.google.cn/studio/run/managing-avds)。 请务必选择 Pixel 设备,并对系统映像选择 R。 返回 AVD 管理器的虚拟设备列表,双击新虚拟设备即可启动该设备。
分区存储
数据迁移到使用分区存储时可见的目录:
大多数应用都不需要使用 preserveLegacyExternalStorage。此标记仅适用于这样一种情况:你将应用数据迁移到了与分区存储兼容的位置,并且希望用户在更新你应用时保留对数据的访问权限。使用此标记会导致更难以测试分区存储对应用的用户有何影响,因为当用户更新应用时,它会继续使用旧版存储模型。
如果使用 preserveLegacyExternalStorage,则旧版存储模型只在用户卸载应用之前保持有效。如果用户在搭载 Android 11 的设备上安装或重新安装应用,则无论 preserveLegacyExternalStorage 的值是什么,应用都无法停用分区存储模型。
测试分区存储
DEFAULT_SCOPED_STORAGE(默认情况下,对所有应用处于启用状态) FORCE_ENABLE_SCOPED_STORAGE(默认情况下,对所有应用处于停用状态)
管理设备存储空间
通过调用 ACTION_MANAGE_STORAGE intent 操作来检查可用空间。 如果设备上的可用空间不足,请提示用户同意让您的应用清除所有缓存。为此,请调用 ACTION_CLEAR_APP_CACHE intent 操作。
媒体文件访问权限
执行批量操作
[createWriteRequest()] (android.content.ContentResolver, java.util.Collection) 用户向应用授予对指定媒体文件组的写入访问权限的请求。
[createFavoriteRequest()] (android.content.ContentResolver, java.util.Collection, boolean) 用户将设备上指定的媒体文件标记为“收藏”的请求。对该文件具有读取访问权限的任何应用都可以看到用户已将该文件标记为“收藏”。
[createTrashRequest()] (android.content.ContentResolver, java.util.Collection, boolean) 用户将指定的媒体文件放入设备垃圾箱的请求。垃圾箱中的内容在特定时间段(默认为 7 天)后会永久删除。
[createDeleteRequest()] (android.content.ContentResolver, java.util.Collection) 用户立即永久删除指定的媒体文件(而不是先将其放入垃圾箱)的请求。
使用原始路径访问文件
文件和目录访问限制
访问目录
Downloads 根目录。 设备制造商认为可靠的各个 SD 卡卷的根目录,无论该卡是模拟卡还是可移除的卡。
访问文件
Android/data/ 目录及其所有子目录。 Android/obb/ 目录及其所有子目录。
权限
存储运行时权限已重命名为文件和媒体。 如果应用未停用分区存储并且请求 READ_EXTERNAL_STORAGE 权限,则用户会看到不同于 Android 10 的对话框。该对话框会指示应用正在请求访问照片、视频、音频剪辑和文件。 用户可以在系统设置中查看哪些应用具有 READ_EXTERNAL_STORAGE 权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具有该权限的每个应用都列在允许存储所有文件下。
所有文件访问权限
声明 MANAGE_EXTERNAL_STORAGE 权限。 使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent 操作将用户引导至一个系统设置页面,在该页面上,用户可以为应用启用以下选项:授予所有文件的管理权限。
对共享的存储空间内所有文件的读写访问权限。 对 MediaStore.Files 表的内容的访问权限。
自定义消息框视图被屏蔽
getView() 方法返回 null。 以下方法的返回值并不反映实际值,因此尽量别使用: getHorizontalMargin() getVerticalMargin() getGravity() getXOffset() getYOffset() 以下方法是空操作,因此应用不应使用: [setMargin()](float, float) [setGravity()](int, int, int)
前台服务类型
<service ... android:foregroundServiceType="location|camera" />
</manifest>
MAC 地址
NetworkInterface.getHardwareAddress() 会针对每个接口返回 null。 应用无法对 NETLINK_ROUTE 套接字使用 bind() 函数。 IP 命令不会返回有关接口的信息。
每个进程的网络访问控制
<process />
<deny-permission android:name="android.permission.INTERNET" />
<process android:process=":withoutnet1" />
<process android:process="com.android.cts.useprocess.withnet1">
<allow-permission android:name="android.permission.INTERNET" />
</process>
<allow-permission android:name="android.permission.INTERNET" />
<process android:process=":withoutnet2">
<deny-permission android:name="android.permission.INTERNET" />
</process>
<process android:process="com.android.cts.useprocess.withnet2" />
</processes>
一次性权限
如果用户按返回按钮关闭权限对话框,此操作不算“拒绝”操作。 如果用户使用 [requestPermissions()](android.app.Activity, java.lang.String[], int)从您的应用转到系统设置,然后按返回按钮,此操作就算是“拒绝”操作。
悬浮窗口 intent 始终会将用户转至系统权限屏幕
限制非 SDK 接口
Open Mobile API 变更
解析运营商权限的规则。 使用以下一项或多项来自定义嵌入式安全元件 (eSE) 访问权限或配置 eSE: 系统特许权限 可配置的访问规则应用主数据 (ARA-M) 应用标识符 (AID) 用于重置 OMAPI 读取器的系统 API 为读取器提供清晰的指示符,以便应用过滤设备功能。
支持并发使用多个摄像头
getConcurrentStreamingCameraIds() 可返回摄像头 ID 组合 Set,这些组合可与有保证的数据流组合并发进行流式传输(如果它们是由同一应用进程配置的)。 isConcurrentSessionConfigurationSupported() 可查询摄像头设备是否可以并发支持相应的会话配置。
https://developer.android.google.cn/preview