Android 13 开发者预览版

48 篇文章 2 订阅

1.行为变更

1.1隐私权

1.1.1针对附近 Wi-Fi 设备的新运行时权限

Android 13 引入了 NEARBY_WIFI_DEVICES 运行时权限,该权限属于 NEARBY_DEVICES 权限组,适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。借助此权限,您可以更轻松地说明应用为何访问附近的 Wi-Fi 设备;在以前的 Android 版本中,这类应用则需要声明 ACCESS_FINE_LOCATION 权限。

如果您的应用以 Android 13 为目标平台并调用多个不同的 Wi-Fi API,则必须从用户处获得这项新权

注意:如果您的应用尝试在未获得适当权限的情况下调用 Wi-Fi API,则会发生 SecurityException

1.1.2受影响的用例

这项新权限会影响几个不同的 Wi-Fi 用例,包括以下用例:

  • 查找或连接到附近的设备,如打印机或媒体投射设备。通过该工作流,您的应用可以完成以下类型的任务:
    • 通过带外方式(例如通过 BLE)接收 AP 信息。
    • 使用仅限本地使用的热点,通过 Wi-Fi 感知和连接功能发现并连接到设备。
    • 通过 Wi-Fi 直连发现和连接到设备。
  • 发起与已知 SSID(例如汽车或智能家居设备)的连接。
  • 开启仅限本地使用的热点。
  • 连接到附近的 Wi-Fi 感知设备。

1.1.3该权限属于“附近的设备”权限组

NEARBY_WIFI_DEVICES 权限是附近的设备权限组的一部分。此权限组在 Android 12(API 级别 31)中添加,还包含与蓝牙和超宽带相关的权限。如果您的应用请求此权限组中的多项权限,用户会看到一个运行时对话框,其中会请求用户批准您的应用访问附近的设备。在系统设置中,用户必须以组的形式启用和停用附近的设备权限;例如,针对给定应用,用户无法既停用其 Wi-Fi 访问权限,但又保持启用其蓝牙使用权限。

1.1.4坚定地声明您的应用不会推导物理位置

在以 Android 13 为目标平台时,请考虑您的应用是否会通过 Wi-Fi API 推导物理位置;如果不会,则应坚定声明此情况。如需做出此声明,请在应用的清单文件中将 usesPermissionFlags 属性设为 neverForLocation,如以下代码段所示。此过程类似于您声明绝不会将蓝牙设备信息用于获取位置信息时的过程:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

1.1.5保持后向兼容性

由于 NEARBY_WIFI_DEVICES 权限仅适用于 Android 13 或更高版本,因此您应保留对 ACCESS_FINE_LOCATION 的所有声明,以便在您的应用中提供向后兼容性。不过,只要您坚定声明应用不会使用 Wi-Fi API 推导物理位置信息,就可以将此权限的最高 SDK 版本设为 32,如下以下代码段所示:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

1.1.6请注意,某些 API 仍需要位置信息权限

有几个 Wi-Fi API 仍然需要 ACCESS_FINE_LOCATION 权限才能获取位置信息,就像它们在 12L 及更低版本上的一样。示例包括 WifiManager 类中的以下方法:

1.1.7检查需要新权限的 API

如果您的应用以 Android 13 或更高版本为目标平台,您必须声明 NEARBY_WIFI_DEVICES 权限才能调用以下任何 Wi-Fi API:

1.1.8Wi-Fi 访问工作流

图 1 显示了搭载 12L 或更低版本的设备上的 Wi-Fi 访问工作流。请注意对 ACCESS_FINE_LOCATION 权限的依赖。

图 1. 用于确定以 12L 或更低版本为目标平台的应用是否可以获取 Wi-Fi 信息的流程图。

图 2 显示了搭载 Android 13 或更高版本的设备上的 Wi-Fi 访问工作流(对于以 Android 13 或更高版本为目标平台的应用)。请注意,只要您声明应用不会根据 Wi-Fi 设备信息推导物理位置信息,就不再需要声明 ACCESS_FINE_LOCATION 权限:

图 2. 用于确定以 Android 13 或更高版本为目标平台的应用是否可以获取 Wi-Fi 信息的流程图。

1.2安全

1.2.1intent 过滤器会屏蔽不匹配的 intent

在现有实现中,“intent 过滤器”一词不合常理,因为它不会过滤传递给某个组件的 intent;而是仅在隐式 intent 的 intent 解析期间相关。当应用在其清单中注册某个导出的组件并添加 <intent-filter> 时,该组件可以由任何 intent 启动,即使那些 intent 与 intent 过滤器不匹配也可以。

启动组件时,如果不检查 intent,在某些情况下,这让外部应用能够触发本应属于应用内部的功能。

在此变更之前,可通过两种方法将 intent 传递给存在 intent 与所声明 <intent-filter> 元素不匹配情况的组件(例如 <activity>):

  1. 显式 intent:已设置组件名称的 intent;只要发送者有相应权限,这种 intent 始终会传递给相应组件。

  2. intent 选择器:当将匹配的 intent 设置为主 intent 的选择器时,系统将始终传递主 intent。

对于以 Android 13 或更高版本(即 intent 接收端)为目标平台的应用,当且仅当导出的组件与其声明的 <intent-filter> 元素相匹配时,系统才会将来自外部应用的所有 intent 传递给该组件。

不匹配的 intent 会被屏蔽。未强制执行 intent 匹配的例外情况包括:

  • 传送到未声明任何 intent 过滤器的组件中的 intent
  • 来自同一应用内、来自系统和来自根的 intent

2.功能和 API 概览

Android 13 面向开发者引入了一些出色的新功能和 API。以下几部分内容可帮助您了解适用于您的应用的功能并开始使用相关 API。

有关新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档 - 新 API 会突出显示以方便查看。此外,如需了解平台变更可能会在哪些方面影响您的应用,请务必查看会影响以 Android 13 为目标平台的应用所有应用的 Android 13 行为变更。

2.1用户体验

2.1.1带主题的应用图标

   图 1:在 Android 13 中选择启用带主题的应用图标

从 Android 13 起,用户可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。

如需支持此功能,您的应用必须提供单色应用图标,并通过清单中的 <adaptive-icon> 元素指向该图标。如果用户在其设备上启用了带主题的图标切换开关,系统会使用用户所选壁纸和主题的配色来确定色调颜色,然后该颜色将用于单色应用图标。

规范

您的单色应用图标应符合以下规范:

  • 它应该是 VectorDrawable
  • 我们建议该徽标适合 90x90 dp 容器中的 36x36 dp 的区域内。如果需要更大尺寸的徽标,最大可以为 60x60 dp。
  • 我们建议您使用平面徽标;如果您的徽标是三维的,那么您可以使用 Alpha 渐变。

大多数应用都可以重复使用用于通知的矢量可绘制对象。

以下示例展示了 Google 应用的单色应用图标,其中虚线表示徽标和容器区域之间的边界。此处显示的边界仅用于图示说明,其大小不可调整。

图 2:带主题的应用图标的测量值

1 容器区域 (90x90 dp)。

2 徽标区域(建议尺寸为 36x36 dp,最大尺寸为 60x60 dp)。

实现带主题的应用图标

将 monochrome android:drawable 属性添加到 <adaptive-icon> 元素中。例如,在 res/mipmap-anydpi-v26/ic_launcher.xml 中:

<adaptive-icon >
    <background android:drawable="..." />
    <foreground android:drawable="..." />
    <monochrome android:drawable="@drawable/myicon" />
</adaptive-icon>

在您的清单文件中,使用 android:icon 定义图标:

<application
    …
    android:icon="@mipmap/ic_launcher"
    …>
</application>

注意:如果清单中同时包含 android:roundIcon 和 android:icon,您必须移除对 android:roundIcon 的引用,或者在由 android:roundIcon 属性定义的可绘制对象中提供单色图标。

2.1.2Quick Settings Placement API

通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。对于提供自定义图块的应用,用户可以更轻松地发现图块并将其添加到“快捷设置”。借助新的图块放置 API,您的应用现在可以提示用户直接将自定义图块添加到一组有效的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。

2.1.3为多语言用户提供更好的支持

Android 13 引入了几项功能来改进多语言用户的应用体验,具体介绍请参阅以下几部分:

按应用设定的语言偏好设置

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 引入了一些 API,它们使应用可在运行时设置在界面中显示不同语言

使用自定义应用内语言选择器的应用可以使用这些新 API 来减少显示应用内语言选择器所需的样板代码量。为了支持旧版 Android 平台,我们将在即将发布的 Jetpack 库版本中添加类似的 API。

不支持多种语言的应用不受这些变更的影响。

如需了解详情,请参阅按应用设定的语言偏好设置页面。

Unicode 库更新

Android 13 添加了一些最新改进、修复和变更,均包含在 Unicode ICU 70Unicode CLDR 40 和 Unicode 14.0 中。

以下是两项显著变更:

  • 英语(加拿大)en‑CA 和英语(菲律宾)en‑PH 在无可用的翻译资源时均使用英语(美国)en 翻译资源,而非英语(英国)en‑GB 翻译资源。
  • 针对西班牙语 es、意大利语 it、葡萄牙语 pt 和葡萄牙语(葡萄牙)pt‑PT 引入了 many 复数类别。与 CLDR v38 中引入的法语类似,此类别适用于大数目。

2.1.4更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在 TextView 中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在 setHyphenationFrequency() 中使用新的 fullFast 或 normalFast 频率。

2.2图形

2.2.可编程的着色器

改写自此 GLSL 着色器的 AGSL 动画着色器。

Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。

2.3核心功能

OpenJDK 11 更新

Android 13 开始刷新 Android 的核心库,以与 OpenJDK 11 LTS 版本保持一致,并增添了适合应用和平台开发者的库更新和 Java 11 语言支持。Android 13 中引入的核心库变更还可以通过 Google Play 系统更新到 ART Mainline 模块,供 Android 12 设备使用。

Android 13 包含对核心库的以下更改:

  • 支持将 var 关键字用于局部变量,以及用作参数 lambda。
  • String 类中的新方法:

    • isBlank()
    • lines()
    • repeat()
    • strip()
    • stripLeading()
    • stripTrailing()
  • 支持 Collection.toArray(IntFunction),以便更轻松地使集合适应数组。

  • 支持 java.util 类 OptionalOptionalDoubleOptionalInt 和 OptionalLong 中的 ifPresentOrElse()isEmpty()orElseThrow() 和 stream()

  • 扩展了对 SocketOptions 的支持,包括重复使用套接字。

  • NullReaderNullWriterInputStreamOutputStream 和 transferTo()Reader 功能,用于将读取的字符传输给 Writer

  • 添加了使用 Charsets 进行网址编码和解码的功能。

  • 适用于 FileReaderFileWriterPrintStream 和 PrintWriter 的 Charset 功能。

  • 为 ByteArrayInput 或 OutputStream 以及 Input 或 OutputStream 新增了 transferTo()readNBytes()readAllBytes() 和 writeBytes() 函数。

  • 对 java.lang.invoke.VarHandle 的运行时和编译器支持。

  • 在内部使用 VarHandle 将 java.util.concurrent 更新到 OpenJDK 11 API。

Java 和 OpenJDK 是 Oracle 及/或其关联公司的商标或注册商标。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android Camera2 API是Android系统提供的一种新的相机框架,用于实现相机预览和采集功能。Camera2 API可以提供更强大、更灵活的相机控制和图像处理能力。 相比于传统的Camera API,Camera2 API具有以下优势: 1. 能够同时管理多个相机设备:Camera2 API支持同时管理多个相机设备,包括前置摄像头、后置摄像头、深度摄像头等,可以方便地进行相机切换和管理。 2. 提供更灵活的相机控制:Camera2 API提供了更丰富的相机控制选项,可以精确地设置曝光时间、ISO值、焦距等参数,以便于用户根据不同的拍摄场景进行调整。 3. 支持原生的相机预览和采集:Camera2 API提供了对原生的预览和采集数据的支持,可以更高效地获取图像数据,用户可以利用这些数据进行实时的图像处理或者保存。 4. 支持原生的相机回调:Camera2 API提供了原生的相机回调接口,用户可以通过设置回调函数来实时获取相机的状态和图像数据,从而实现一些特殊的相机功能,如实时人脸检测、连拍等。 总之,Android Camera2 API提供了更强大、更灵活的相机功能,可以满足开发者对相机预览和采集的各种需求。无论是在智能手机、平板电脑还是其他移动设备上,都可以通过Camera2 API来实现高质量的相机应用。 ### 回答2: Android Camera 2是Android系统中用于处理相机功能的全新API。相较于之前的Camera API,Camera 2更加强大和灵活,提供了更多的功能和优化。 在Android Camera 2中,预览采集是通过创建一个CameraDevice实例来实现的。首先,需要获取相机的相关信息,例如相机的ID、参数等。然后,通过调用CameraManager的openCamera方法来打开指定ID的相机。 在相机打开后,可以通过创建一个CaptureRequest.Builder对象来配置相机的预览设置。可以设置预览的目标Surface、预览图像的尺寸、帧率等。然后,通过调用createCaptureSession方法,传入预览的目标Surface和一个CameraCaptureSession.StateCallback来创建一个预览会话。 在预览会话创建后,可以调用setRepeatingRequest方法来开始预览。Camera2会自动将预览帧数据传输到指定的Surface上,并在Surface上更新预览图像。同时,可以通过设置回调函数来处理预览数据,例如实时显示预览图像、进行进一步的图像处理等。 在预览过程中,还可以根据需要调整相机的参数,例如调整曝光度、焦距、白平衡等。通过创建新的CaptureRequest.Builder对象并设置相应参数,然后调用Session的setRepeatingRequest方法,可以实现动态调整相机参数。 总而言之,Android Camera 2提供了更强大和灵活的方式来实现相机预览采集。通过合理地使用Camera2的API,我们可以轻松地实现各种功能,例如实时预览、图像处理、动态调整参数等。 ### 回答3: Android Camera2预览采集是通过使用Android操作系统的Camera2 API来实现的一种方式。Camera2 API是Android 5.0(Lollipop)版本引入的相机框架,它提供了更多的功能和灵活性,用于控制和管理Android设备上的相机。 使用Camera2 API进行预览采集是一种相对较新和高级的方法,相比传统的Camera API,Camera2 API提供了更多的控制选项和功能,以及更好的性能和稳定性。 通过Camera2 API,我们可以实时地从Android设备的摄像头获取图像,并将图像传输到屏幕上进行实时预览。预览采集可以在应用程序中使用,例如用于视频通话、拍照、视频录制等场景。 Camera2 API的预览采集过程主要涉及以下步骤: 1. 获取相机设备:通过CameraManager类获取设备的摄像头列表,并选择要使用的摄像头设备。 2. 创建相机会话:使用CameraDevice类进行连接和建立与相机设备的会话。 3. 创建预览请求:使用CaptureRequest.Builder类创建一个预览请求,并设置相应的参数,例如预览尺寸、帧率等。 4. 创建预览会话:使用CameraDevice类创建预览会话,并将预览请求设置为预览会话的目标。 5. 开启预览:将预览会话设置为活动状态,相机将开始实时地捕获图像,并通过指定的Surface进行预览。 通过这些步骤,我们可以在Android设备上实现相机预览采集功能,并根据需要进行自定义设置和扩展。预览采集可以进一步应用于更多的相机应用场景,例如人脸识别、图像处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值