Restrições de experiência do usuário de carro

Antes de continuar, leia as diretrizes sobre distração ao dirigir.

Nesta página, descrevemos as regras de restrições de experiência do usuário (UX) do carro que podem ser usadas para criar várias configurações de regras de restrições de UX (por exemplo, União Europeia x Japão) e, em seguida, determinar qual conjunto de regras aplicar durante a execução. Para mais informações, consulte CarUxRestrictions.

O serviço de restrições de UX do carro permite que os desenvolvedores definam uma nova configuração de restrições de UX do carro. Se um desenvolvedor quiser modificar as regras de restrição (por exemplo, para obedecer aos padrões de segurança locais), ele poderá usar a API para definir a nova configuração.

A API para definir a configuração persiste apenas na nova configuração. Em outras palavras, a configuração não entra em vigor imediatamente. Em vez disso, a nova configuração é carregada quando o serviço de restrições de UX é reiniciado e o carro está estacionado. O serviço de carro garante que o carro esteja estacionado antes de recarregar a nova configuração.

Além do novo método de serviço de restrições de UX, as APIs são fornecidas para criar a configuração. O estado da seleção de marcha e da velocidade é convertido em um de três estados de direção:

  • Estacionado. Engate o freio de estacionamento.
  • Inatividade. A marcha não está no modo de estacionamento e a velocidade é zero.
  • Movendo. A marcha não está no modo de estacionamento e a velocidade não é zero.

Para saber como os apps consomem o estado de direção de um carro e as restrições de UX correspondentes, consulte Consumir o estado de direção do carro e as restrições de UX.

Configuração de restrições com base nos estados da direção

Para evitar distrações, o Android mapeia o estado da direção para um conjunto de restrições de UX /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Estacionado. Sem restrições.
  • Inatividade. Sem vídeo e sem tela de configuração.
  • Movendo. Restrição total (todas as restrições são obrigatórias).

O mapeamento ilustrado acima é predeterminado e configurado como um recurso XML. O /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java salva as regras na memória. Em seguida, o serviço mapeia o estado atual da direção para restrições de UX e transmite as restrições atuais para todo o sistema.

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

Configurações para vários anúncios gráficos

Por padrão, nenhuma restrição é aplicada a telas extras. Para criar configurações de restrição para várias telas, inclua a tag RestrictionMapping com o physicalPort da tela. As restrições adequadas são aplicadas automaticamente a cada tela. No exemplo a seguir, os monitores com IDs de porta física 1 e 2 têm configurações diferentes:

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

Configurações para modos de restrição

Você pode escolher qualquer nome para o modo, como adolescente. No exemplo a seguir, diferentes restrições são configuradas para os modos padrão e passageiro. Antes, apenas o modo passageiro era compatível:

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
Use a API para definir qualquer nome de string para o modo. Por exemplo, o método setRestrictionMode(@NonNull String mode) em CarUxRestrictionsManager. Antes, você usava o método setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) em CarUxRestrictionsManager.

APIs CarUxRestrictionsConfiguration

Restrições com CarUxRestrictionsConfiguration

A nova classe CarUxRestrictionsConfiguration é mapeada de um para um com o esquema de configuração XML atual. CarUxRestrictionsConfiguration pode ser construído com CarUxRestrictions.Builder, que valida a configuração ao chamar build().

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

API CarUxRestrictionsManager

Defina CarUxRestrictionsConfiguration para a próxima unidade com CarUxRestrictionsManager. Esse método requer a permissão Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Persistir uma nova configuração de restrições de UX

Quando uma nova configuração é transmitida, o serviço de restrições de UX retorna um booleano para indicar se a nova configuração foi salva com sucesso. Essa nova configuração só é usada quando a unidade principal integrada (IHU) é reiniciada e o carro está estacionado. Internamente, o serviço UX Restrictions contém dois conjuntos de configurações:

  • Produção. Embora seja opcional, essa configuração geralmente está presente. O serviço de restrições de UX lê essa configuração ao iniciar.
  • Em testes. Também opcional, essa configuração não tem efeito nas restrições de UX e é promovida para produção quando o serviço do carro é iniciado e quando o carro está estacionado.

Configuração de produção

Figura 1. Configuração de produção

Resolver falhas de endereço

Até que as informações de estado de direção sejam recebidas do CarPropertyManager (por exemplo, durante a inicialização), as restrições de UX não serão aplicadas. O sistema funciona como se o estado de condução fosse Estacionado.

Se a leitura de uma configuração salva falhar (por exemplo, resultados de SettingNotFoundException), o serviço de restrições de UX vai voltar ao modo codificado e totalmente restrito:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

Estado da direção e restrições do usuário

O conteúdo a seguir descreve as interações mostradas no diagrama de design abaixo:

Interações com o estado de condução

Figura 2. Interações com o estado de condução

Propriedades usadas para derivar o estado de direção

Use os três VehiclePropertyIds a seguir para derivar o estado de direção:

APIs disponíveis para apps

O código está nos seguintes locais:

Código Local
CarUxRestrictionsManager
APIs públicas para registrar mudanças na restrição de UX.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Definição de restrições de UX.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
APIs do sistema para registrar mudanças de estado de direção.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de direção, consulte Testes.