Android T 开发者网站(功能变更):
功能和 API 概览 | Android 开发者 | Android Developers
一、开发者的工作效率
1、新的复制和粘贴界面
(1)、避免显示重复的通知
为避免在 Android 13 中显示重复的复制确认界面,请尝试使用如下代码:
检出方式:
调用setPrimaryClip后, 要弹出复制成功的toast的场景下
private void copyContent() {
final Editable text = getText();
int textLength = text.length();
setSelection(0, textLength);
ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(
Context.CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText(null, text));
Toast.makeText(getContext(), R.string.text_copied_toast, Toast.LENGTH_SHORT).show();
setSelection(textLength);
}
对应方式:
在Android12及以下的版本, 允许弹出toast提示, Android13以上的版本, 不弹出toast提示
private void copyContent() {
final Editable text = getText();
int textLength = text.length();
setSelection(0, textLength);
ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(
Context.CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText(null, text));
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
Toast.makeText(getContext(), R.string.text_copied_toast, Toast.LENGTH_SHORT).show();
}
setSelection(textLength);
}
(2)、将敏感内容添加到剪贴板
如果应用允许用户将敏感内容(例如密码或信用卡信息)复制到剪贴板,则必须在调用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一个标志。添加此标志可阻止敏感内容出现在内容预览中。
检出方式:
原代码逻辑中使用了ClipboardManager, 且有对于敏感信息的处理, --> "android.content.extra.IS_SENSITIVE"
对应方式:
// API 33及33以上
ClipDescription clipDescription = clip.getDescription();
PersistableBundle persistableBundle = new PersistableBundle();
persistableBundle.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
clipDescription.setExtras(persistableBundle);
// API 33 以下
ClipDescription clipDescription = clip.getDescription();
PersistableBundle persistableBundle = new PersistableBundle();
persistableBundle.putBoolean("android.content.extra.IS_SENSITIVE", true);
clipDescription.setExtras(persistableBundle);
2、预测性返回手势
KeyEvent.KEYCODE_BACK 和 onBackPressed API被废弃
从 Android 13 最终版开始, 可以通过启用开发者选项来测试此返回主屏幕动画
测试方法:
设置 > 系统 > 开发者选项 ( Settings > System > Developer options )
选择预测性返回手势动画 ( Predictive back animations )
启动更新后的应用,然后执行返回手势,查看实际运行效果。
对应方式:
(1)、更新使用默认返回导航的应用
如果应用之前未实现任何自定义返回行为(换言之,由系统处理返回导航), 则只需在AndroidManifest.xml 的
若未提供值,则默认为 false 并停用预测性返回手势。
(2)、更新使用自定义返回导航的应用
①使用了Android X 关于返回导航, 使用了AndroidX APIs
适用于使用 OnBackPressedDispatcher 实现自定义手势导航处理功能的新应用或现有应用.
如提供自定义返回导航中所述。
简而言之, 应用界面中没有添加多余的返回按钮, 而是按照Android维护的目的地返回堆栈进行.
这种情况下, 如(16, B)所述, 启用预测性返回手势.
②使用了Android X, 但会实现或引用不受支持的返回导航 API,则需要改用 AndroidX API 来支持新行为。
如需将不受支持的 API 迁移到 AndroidX API,请执行以下操作:
a、通过实现 OnBackPressedCallback 将系统返回导航处理逻辑迁移到 AndroidX 的 OnBackPressedDispatcher。如需获得详细指导,请参阅提供自定义返回导航。
b、如需停止拦截系统返回导航,请停用之前启用的所有 OnBackPressedCallback 实例,或者任何时候都不启用任何回调。
c、成功迁移应用后,请按照本( 16, B )中的说明选择启用预测性返回手势。
③不使用Android X, 而是使用不受支持的 API 实现或引用自定义返回导航,您必须迁移到 OnBackInvokedCallback 平台 API.
完成以下步骤,将不受支持的 API 迁移到平台 API:
a、在搭载 Android 13 或更高版本的设备上使用新的 OnBackInvokedCallback API,并在搭载 Android 12 或更低版本的设备上依赖不受支持的 API。
b、在 OnBackInvokedCallback 中使用 onBackInvoked 方法中的逻辑注册自定义返回逻辑。这样可防止当前 activity 完成,并且当用户完成系统返回导航后,您的回调有机会对返回操作做出响应。
c、为了确保未来对系统返回导航的增强功能得到适当支持,您的应用必须取消注册 OnBackInvokedCallback。否则,使用系统返回导航时,用户可能会看到不希望出现的行为,例如在视图之间“卡住”并强制退出应用。
d、成功迁移应用后,按照 (16,B) 所述采用预测性返回手势
3、带主题的应用图标
对应方式:
将 monochrome android:drawable 属性添加到
例如,在 res/mipmap-anydpi-v26/ic_launcher.xml 中:
在清单文件中,使用 android:icon 定义图标:
注意:如果清单中同时包含 android:roundIcon 和 android:icon,您必须移除对 android:roundIcon 的引用,或者在由 android:roundIcon 属性定义的可绘制对象中提供单色图标。
4、Quick Settings Placement API
通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。
TileService 为用户提供了一个可以添加到快速设置的图块。
TileService 将被匹配.ACTION_QS_TILE 并需要权限“android.permission.BIND_QUICK_SETTINGS_TILE”的图块检测到。
5、为多语言用户提供更好的支持
(1)、系统设置:可让用户在一个位置为各个应用选择首选语言
①创建一个名为 res/xml/locales_config.xml 的文件,并指定您的应用的语言
②在清单中,添加一行指向这个新文件的代码:
通过以下方式设置:
①通过系统设置访问
设置 > 系统 > 语言和输入法 > 应用语言 >(选择一款应用)
②通过应用设置访问
设置 > 应用 >(选择一款应用)> 语言
(2)、改进了日语文本换行
TextView 可以按 Bunsetsu(最小自然语素单元)或短语而非字符进行文本换行,从而使日语应用的界面更加美观、易读
在TextView控件上加上android:lineBreakWordStyle="phrase"属性
(3)、改进了非拉丁字母的行高
新的行高可防止字符被裁剪并改进了字符的放置。
(4)、文本转换 API(IME相关)
①输入平假名作为其搜索字词(例如地点或应用名称)的发音
②使用键盘将平假名字符转换为日语汉字
③使用日语汉字字符重新进行搜索
④最后获得搜索结果
使用新的文本转换 API 时,日语用户可以输入平假名,然后不经过第 2 步和第 3 步就立即看到实时的日语汉字搜索结果。
(5)、Unicode 库更新
两项显著变更:
①英语(加拿大)en‑CA 和英语(菲律宾)en‑PH 在无可用的翻译资源时均使用英语(美国)en 翻译资源,而非英语(英国)en‑GB 翻译资源。
②针对西班牙语 es、意大利语 it、葡萄牙语 pt 和葡萄牙语(葡萄牙)pt‑PT 引入了 many 复数类别。与 CLDR v38 中引入的法语类似,此类别适用于大数目。
6、彩色矢量字体
Android 13 可支持呈现 COLR 版本 1 (COLRv1) 字体,并将系统表情符号更新成了 COLRv1 格式。
COLRv1 是一种高度紧凑的新字体格式,该字体在任意大小下都可以快速清晰地呈现。
对于大多数应用,系统会处理所有工作,COLRv1 可以正常使用。
不过,如果您的应用使用系统字体来实现自己的文本呈现,建议您对表情符号呈现进行测试。
7、更快断字
断字让分行的文本更易于阅读,并且有助于使界面更具自适应性
如需启用更快断字功能,请在 setHyphenationFrequency() 中使用新的 fullFast 或 normalFast 频率。
8、蓝牙LE音频
低功耗 (LE) 音频是新一代无线音频,旨在取代传统蓝牙并支持新的使用情形和连接拓扑。
通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。
这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。
9、MIDI 2.0
可支持新的 MIDI 2.0 标准,包括能够通过 USB 连接 MIDI 2.0 硬件。
此新版标准有诸多优点,如提升控制器精度、改善对非西方地区语调的支持,以及提高使用单一音符控制器时的表现力。
二、隐私权和安全
1、更安全地导出上下文注册的接收器
识别方式:
代码中动态注册了广播接收器
对应方式:
在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播:
// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
RECEIVER_EXPORTED);
// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,
RECEIVER_NOT_EXPORTED);
传RECEIVER_EXPORTED这个参数,才能收到其他应用发的广播
如果使用RECEIVER_NOT_EXPORTED这个参数,即使是其他应用发定向广播也接收不到
如果导出广播接收器,其他应用将可以向您的应用发送不受保护的广播。
注意:如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。
否则,当您尝试注册广播接收器时,系统会抛出 SecurityException。
2、照片选择器
应用启动照片选择器时,用户可选择与应用分享特定图片和视频(如个人资料照片),而不是授予应用查看整个媒体库的权限。
照片选择器可为用户提供更好的隐私保护,因为您的应用无需声明任何运行时权限。此外,照片选择器还为应用提供内置标准化界面,从而打造更一致的用户体验。
(1)、定义分享限制
// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, );
EXTRA_PICK_IMAGES_MAX extra 指定照片选择器中应显示照片的数量上限
(2)、处理照片选择器结果
在 setType() 方法中设置 MIME 类型,以便按“仅显示照片”或“仅显示视频”进行过滤
// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");//仅过滤视频类型
startActivityForResult(intent, );
3、针对附近WiFi设备的新运行时权限
Android 13(API 级别 33)在 NEARBY_DEVICES 权限组中引入了一项新的运行时权限,它适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。
这些应用在调用多个不同的 Wi-Fi API 时必须声明新的权限 NEARBY_WIFI_DEVICES。
只要应用不会通过 Wi-Fi API 推导物理位置,那么在以 Android 13 或更高版本为目标平台时,就无需声明
在清单中声明
4、使用精确闹钟的新权限
如果应用以 Android 13 为目标平台,可以使用自动授予应用的 USE_EXACT_ALARM 权限(不向用户开放)
但必须至少满足以下条件之一:
①是闹钟应用或计时器应用。
②是日历应用,可显示即将进行的活动的通知。
如果您的应用设置了精确闹钟,但不符合前面列表中显示的任一情况,
请改为继续声明 SCHEDULE_EXACT_ALARM 权限,并为用户拒绝授予您应用相应访问权限的情况做好准备
5、开发者可降级权限
从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可让您的应用执行增强隐私权的任务,如下所示:
撤消未使用的权限。
遵循权限最佳做法,从而提高用户信任度。您可能需要考虑向用户显示一个对话框,其中会显示您主动撤消的权限。
对应方式:
如需撤消特定运行时权限,请将该权限的名称传入 revokeSelfPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeSelfPermissionsOnKill()。撤消是异步发生的,会终止与您应用的 UID 相关联的所有进程。
注意:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有权限。在这种情况下,调用 revokeSelfPermissionsOnKill() 会很有帮助。
6、APK签名方案v3.1
具体而言,v3.1 签名方案允许应用在单个 APK 中同时支持原始签名者和轮替签名者。此外,该方案还支持 SDK 版本定位功能,这会允许轮替定位到更高版本的平台。
v3.1 签名方案使用在 12L 或更低版本中无法识别的新分块 ID。因此,平台会应用以下签名者行为:
搭载 Android 13 的设备会使用 v3.1 分块中的轮替签名者。
搭载旧版 Android 的设备会忽略轮替签名者,而使用 v3.0 分块中的原始签名者。
尚未轮替其签名密钥的应用无需执行任何其他操作。每当这些应用选择轮替时,系统都会默认应用新的 v3.1 签名方案。
7、改进了秘钥库和KeyMint中的错误报告功能
对于生成密钥的应用,密钥库和 KeyMint 现在提供更加详细且更准确的错误指示器。我们在 java.security.ProviderException 下添加了一个异常类层次结构,包含了特定于 Android 的异常,其中包括 Keystore/KeyMint 错误代码,以及错误是否可重试。您还可以修改密钥生成方法和使用方法(签名、加密),以抛出新的异常。改进的错误报告并不仅限于生成密钥,现在应为您提供重试密钥生成所需的内容。
三、平板电脑和大屏设备支持
Android 13 基于 Android 12 中引入的平板电脑优化和 Android 12L 功能更新构建而
成 - 包括针对系统界面的优化、更出色的多任务处理功能和改进的兼容模式。在测
试过程中,请确保您的应用在平板电脑和其他大屏设备上拥有最佳显示效果。
四、图形
1、可编程的着色器
Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图
形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android
渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内
部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 使您能够
为应用制作类似的高级效果。
五、媒体
1、预期音频路由
为了帮助媒体应用确定其音频的路由方式,我们在 AudioManager 类中添加了新的音频路由 API。
新的 getAudioDevicesForAttributes() API 允许检索可以用于播放指定音频的设备列表,
添加了可帮助您了解音频流是否可以直接播放的 getDirectProfilesForAttributes()。
使用这些新 API 可确定最适合用于您的音轨的 AudioFormat。
六、无障碍功能
1、语音描述
Android 13(API 级别 33)引入了新的系统级无障碍功能偏好设置,允许用户跨所有应用启用音频说明。
七、核心功能
1、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
类 Optional
、OptionalDouble
、OptionalInt
和 OptionalLong
中的 ifPresentOrElse()
、isEmpty()
、orElseThrow()
和 stream()
。
扩展了对 SocketOptions
的支持,包括重复使用套接字。
NullReader
、NullWriter
、InputStream
、OutputStream
和 transferTo()
Reader
功能,用于将读取的字符传输给 Writer
。
添加了使用 Charsets
进行网址编码和解码的功能。
适用于 FileReader
、FileWriter
、PrintStream
和 PrintWriter
的 Charset
功能。
为 ByteArrayInput
或 OutputStream
以及 Input
或 OutputStream
新增了 transferTo()
、readNBytes()
、readAllBytes()
和 writeBytes()
函数。
对 java.lang.invoke.VarHandle
的运行时和编译器支持。
在内部使用 VarHandle
将 java.util.concurrent
更新到 OpenJDK 11 API。