使用设置

设置是 Fuchsia SDK 的一部分,适用于 合适的支持软件包这些产品上的应用可与 设置。互动遵循 以常用模式访问和修改“设置”中的各项设置 协议

本指南详细介绍了将“设置”整合到 以及如何与“设置”交互

前提条件

设置服务支持 Fuchsia 中的设置协议。服务的 软件包 //src/settings/service:setui_service 及其核心分片之一 (例如 //src/settings/service:setui_service_core_shard) 产品定义才能使用“设置”。以下产品定义 包括设置:

import("//products/bringup.gni")

base_package_labels += [
  "//src/settings/service:setui_service",
]
core_realm_shards += [
  "//src/settings/service:setui_service_core_shard",
]

有关 Fuchsia 构建系统的更多信息,请参阅 Fuchsia 构建 system

权限

访问“设置”的任何应用都必须通过其组件声明使用情况 清单。例如,以下清单声明了对 fuchsia.settings.accessibility 协议:

{
    program: {
        runner: "elf",
        binary: "bin/example",
    },
    use: [
        { protocol: "fuchsia.settings.Accessibility" },
    ],
}

如需详细了解 Fuchsia 组件,请参阅 组件清单

正在连接

应用通过 Fuchsia 中的运行时绑定访问“设置” SDK。本指南将使用 Rust 作为示例,但绑定适用于 各种其他语言,例如 C++ 和 Dart。

与其他 FIDL 协议一样,访问“设置”的第一步是 连接到“设置服务”。以下示例连接到 fuchsia.settings.accessibility:

let proxy = connect_to_protocol::<AccessibilityMarker>().context("failed to connect to Settings");

在上面的示例中,connect_to_protocolAccessibilityMarker 为 提供的数据

客户端应通过单一连接与每个“设置”协议进行通信。 持续通信必须通过同一连接进行, 确保响应的一致性和连续性,如后文所述。

阅读

每个“设置协议”都会定义一个表格,用于传达相关的 例如状态和状态将数据整理到单一结构下 可让“设置”简洁地传达信息。这种结构还有助于 如稍后所述。在“无障碍功能”中 例如,AccessibilitySettings 会捕获相关详细信息:

/// Supported accessibility settings.
type AccessibilitySettings = table {
    /// For videos, use an alternative audio track (akin to changing languages)
    /// that explains what is happening visually while there is no dialogue.
    1: audio_description bool;

    /// Read aloud elements of the screen selected by the user.
    2: screen_reader bool;

    /// Invert colors on the screen.
    3: color_inversion bool;

    /// Interpret triple-tap on the touchscreen as a command to zoom in.
    4: enable_magnification bool;

    /// What type of color-blindness, if any, to correct for.
    5: color_correction ColorBlindnessType;

    /// What kind of sources get closed captions, and how they look.
    6: captions_settings CaptionsSettings;
};

每个协议中都有一个名为 Watch 的方法, 信息。声明 fuchsia.settings.accessibility:

Watch() -> (struct {
    settings AccessibilitySettings;
});

Watch 遵循挂起的 get 模式,返回当前的 首次调用时发送的信息。对后续调用的响应为 被延迟,直到最后一个返回值更新为止。使用相同的 代理连接对于这种行为至关重要,因为“设置” 根据渠道跟踪传回的响应。如果发生错误 设置将关闭包含相关摘要的 FIDL 频道。

在无障碍功能示例中,调用 Watch 来确定屏幕阅读器是否 已启用:

let settings = proxy.watch().expect("settings retrieved");
let screen_reader_enabled = settings.screen_reader.ok_or(false);

文案

应用可以利用找到的相同表格结构来影响“设置” 来读取数据每个可变协议都提供了与 Watch 对应的方法 名为 Set,该方法接受 AccessibilitySettings 作为参数:

Set(struct {
    settings AccessibilitySettings;
}) -> () error Error;

如需传达更改,请在表格字段中指定所需的最终状态。 由于每个字段都是可选的,因此只需指定受影响的字段。 通过将更改定义为增量,多个调用方的竞态条件 。如果成功,更改将保留并在整个启动过程中应用。 接着前面的示例来讲,调用方可以使用 以下代码:

let new_settings = AccessibilitySettings::default();
new_settings.screen_reader = Some(true);
proxy.set(new_settings).await.expect("request completed").expect("request succeeded");

调试

“设置”提供 Fuchsia CLI 工具 (ffx setui),用于进行互动 协议借助此工具,开发者可以实时访问“设置” 让他们了解“设置”对他们的应用有何影响,以及受到这些因素的影响。 ffx setui 工具附带 Fuchsia 源代码和 SDK。要使用它,请运行 先运行以下命令来选择启用:

ffx config set setui true

检索设置协议的最新信息(除了“辅助功能”和“ VolumePolicy),您可以使用协议名称作为参数来调用 ffx setui。 例如,以下命令可检索关于隐私的信息:

ffx setui privacy

为了实现无障碍功能,请在协议名称后面添加关键字 watch

ffx setui accessibility watch

对于 VolumePolicy,请在协议名称后面添加关键字 get

ffx setui volume_policy get

ffx setui还可以修改设置。该实用程序的 help 命令会详细说明 每种协议的特定修改语法:

ffx setui privacy help

以下示例展示了如何设置用户数据共享意见征求 (user-data-sharing-consent) 设为 true:

ffx setui privacy -u true