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>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., 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.

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:

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 |
|---|---|
CarUxRestrictionsManagerAPIs 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
|
CarUxRestrictionsDefiniçã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.