当前位置:首页 » APP上架 » 正文

Android 13 应用适配指南2,安卓13新功能和API

2.新功能和API

2.1 照片选择器

Android 13 包含对新照片选择器工具的支持。此工具为用户提供了一种安全的内置媒体文件选择方式,让其无需向应用授予对整个媒体库的访问权限。注意

:即将发布的 Google Play 系统更新预计会包含与照片选择器有关的新功能。在一项此类更新中,该库将增加对以 Android 11(API 级别 30)或更高版本为目标平台的应用(不包括 Android Go 设备)的支持。

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API

2.1.1 选择媒体

照片选择器提供了一个可浏览、可搜索的界面,其中按日期(从最近到最早)顺序向用户呈现其媒体库中的文件。您可以指定用户只能看到照片或只能看到视频,并且默认情况下,允许的媒体选择量上限设置为 1。

2.1.2 定义分享限制

应用可以声明android.provider.extra.PICK_IMAGES_MAX的值,该值表示在向用户显示时照片选择器中显示的媒体文件数量上限。例如,如果您提示用户为其帐号选择要求的个人资料照片,请将一张照片设置为分享要求上限。注意

:如果您选择的上限为 1 张,照片选择器会以半屏模式打开。

如需在单选模式下启动照片选择器,请执行以下操作:

// Lau网站封装ipanches photo picker in single-select mode.
// This means that the user can select one photo or video.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);

2.1.3 选择多张照片或多个视频

如果应用的用例需要用户选择多张照片或多个视频,您可以使用EXTRA_PICK_IMAGES_MAX extra 指定照片选择器中应显示照片的数量上限,如以下代码段中所示:

// 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, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);

请注意,可指定为文件数量上限的最大数字存在平台限制。如需访问此限制,请调用MediaStore#getPickImagesMaxLimit()。

2.1.4 处理照片选择器结果

照片选择器启动后,使用新的ACTION_PICK_IMAGES intent 来处理结果。该选择器会返回一组 URI:

// onActivityResult() handles callbacks from the photo picker.
@Override
protected void onActivityResult(
    int requestCode, int resultCode, final Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
        return;
    }
    switch(requestCode) {
        case REQUEST_PHOTO_PICKER_SINGLE_SELECT:
            // Get photo picker response for single select.
            Uri currentUri = data.getData();
            // Do stuff with the photo/video URI.
            return;
        case REQUEST_PHOTO_PICKER_MULTI_SELECT:
            // Get photo picker response for multi select
            for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                Uri currentUri = data.getClipData().getItemAt(i).getUri();
                // Do stuff with each photo/video URI.
            }
            return;
    }
}

默认情况下,照片选择器会既显示照片又显示视频。您还可以在 setType() 方法中设置 MIME 类型,以便按“仅显示照片”或“仅显示视频”进行过滤。例如,如需在照片选择器中仅显示视频,请将video/*传入setType():

// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");
startActivityForResult(intent, );
// Apps can also change the mimeType to allow users to select
// images only - intent.setType("images/*");
// or a specific mimeType - intent.setType("image/gif");

注意:您的应用不能持续访问从此 intent 返回的 URI。当应用的进程结束后,该应用将无法访问 URI。

2.2 应用内语言选择器

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

  • 使应用可在运行时设置在界面中使用其他语言的 API

使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。这些新的 API 还有助于减少样板代码的编写。

为了向后兼容以前的 Android 版本,我们还会从Appcompat 1.6.0-alpha01开始在 AndroidX 中提供这些 API。

  • 允许用户为每个应用选择首选语言的系统设置

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

2.2.1 API 实现

对于当前未使用自定义应用内语言选择器的应用,无需执行任何其他操作。

对于具有或想要使用应用内语言选择器的应用,请使用这些新 API(而非应用的自定义逻辑)来处理相关设置和获取用户对应用的首选语言设置。

使用 AndroidX 支持库来实现

为了向后兼容以前的 Android 版本,建议使用 AndroidX 支持库来实现应用内语言选择器。使用Appcompat 1.6.0-alpha01或更高版本中提供的setApplicationLocales()方法。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY");
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale);

使用 Android 框架 API 来实现

您还可以通过setApplicationLocales()和getApplicationLocales()方法,使用 Android 框架 API 来实现应用内语言选择器。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its localem
Context.getSystemService(LocaleManager.class).setApplicationLocales(newLocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language

如需获取用户当前的首选语言以显示在语言选择器中,您的应用可以从系统中取回该值:

// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales = mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user

2.2.2 面向用户的系统设置

用户可以通过新的系统设置为每个应用选择首选语言。他们可以通过以下两种方式访问这些设置:

  • 通过系统设置访问

设置 > 系统 > 语言和输入法 > 应用语言 >(选择应用)

  • 通过应用设置访问

设置 > 应用 >(选择一款应用)> 语言

已知问题

在测试应用时,有一些已知问题需要注意。

  • 可用语言列表中可能不包含您的应用支持的语言。
  • 如果您的应用使用拆分 APK,当应用语言区域发生变化时,系统不会自动下载这些 APK。
  • 现在的界面只是一个初步版本,在后续版本中会不断更改。

2.2.3 DEMO演示

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API

2.3 可由开发者降级的权限

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。

如需撤消特定运行时权限,请将该权限的名称传入revokeSelfPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入revokeSelfPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。具体而言,当有应用组件仍在前台运行,或者有另一个应用正在访问您应用的组件(如 content provider)时,不会发生撤消。如果您想立即撤消权限,可以调用exit()。但是,对exit()进行此类调用可能会导致当前正在访问您应用的其他应用出现未定义的行为或崩溃。注意

:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有

权限。在这种情况下,调用revokeSelfPermissionsOnKill()

会很有帮助。

2.4 可编程的着色器

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

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API

基于可编程着色器实现的一个简单的绘制效果如下:

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API

2.5 更快断字

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

2.5.1 API变化

Android 13在已有断字模式基础上新增两种Fast模式:fullFast和normalFast,在原有基础上测量更快。

2.5.2 使用建议

在布局中添加属性android:hyphenationFrequency:

<!--少量快速断字模式-->
<TextView android:hyphenationFrequency="fullFast"/>
<!--标准快速断字模式-->
<TextView android:hyphenationFrequency="normalFast"/>

代码中直接设置:

//标准快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL_FAST)
//少量快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL_FAST)

3.影响应用的行为变更

3.1 行为变更:所有应用

3.1.1 前台服务 (FGS) 任务管理器

无论应用采用何种目标 SDK 版本,Android 13 都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为前台服务 (FGS) 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用。每个应用旁边都有一个停止按钮。

下图说明了搭载 Android 13 的设备上的 FGS 任务管理器的工作流程:

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API
3.1.1.1 用户操作会停止您的整个应用

当用户在 FGS 任务管理器中按您应用旁边的停止按钮时,系统会停止您的整个应用,而不仅仅是正在运行的前台服务。

比较可以生成app的网页“向上滑动”用户操作和“强行停止”用户操作的行为:

请参见下表中 FGS 任务管理器与现有功能的比较:从最近用过屏幕“向上滑动”和“强行停止”出现异常的应用。

Android 13 应用适配指南2,安卓13新功能和APIAndroid 13 应用适配指南2,安卓13新功能和API

用户从 FGS 任务管理器停止应用时,不会发送任何回调。

当用户按停止按钮时,系统不会向您的应用发送任何回调。当应用启动备份时,建议您检查一下现有ApplicationExitInfoAPI 中的新REASON_USER_REQUESTED原因,这可能会很有帮助。

3.1.1.2 与长时间运行的前台服务相关的系统提示

如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与 FGS 任务管理器互动。详细了解就长时间运行的前台服务提醒用户的新系统通知。

编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12700/

部分内容来自网络投稿,如有侵权联系立删

未经允许不得转载:一门应用 » Android 13 应用适配指南2,安卓13新功能和API
分享到

相关推荐

联系我们

微信公众号

yimendabao

关注官方微信,了解最新资讯

客服QQ
4001658508

企业QQ,点击发起咨询