Determinar e monitorar o estado e o tipo de encaixe na base

Dispositivos Android podem ser encaixados em diversos tipos de bases. Isso pode incluir bases no carro ou em casa e bases digitais ou analógicas. O estado da base normalmente está intimamente vinculado ao estado de carregamento, porque muitas bases fornecem energia para os dispositivos encaixados.

A forma como o estado da base do smartphone afeta a taxa de atualização depende do seu app. É possível optar pelo aumento da frequência de atualização para o app de um centro esportivo quando ele estiver encaixado na base para computador, ou desativar completamente as atualizações se o dispositivo estiver encaixado na base para carro. Por outro lado, você poderá maximizar as atualizações quando o dispositivo estiver na base para carro se o serviço em segundo plano estiver atualizando as condições de trânsito.

O estado da base também é transmitido como um Intent fixo, permitindo consultar se o dispositivo está encaixado ou não e, se estiver, em que tipo de base.

Determinar o estado atual de encaixe na base

Os detalhes do estado da base são incluídos como um extra na transmissão fixa da ação ACTION_DOCK_EVENT. Como ela é fixa, você pode simplesmente chamar registerReceiver(), transmitindo null como o broadcast receiver. O snippet a seguir mostra como concluir esse processo:

Kotlin

    val dockStatus: Intent? = IntentFilter(Intent.ACTION_DOCK_EVENT).let { ifilter ->
        context.registerReceiver(null, ifilter)
    }
    

Java

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
    Intent dockStatus = context.registerReceiver(null, ifilter);
    

O estado de ancoragem atual pode ser extraído do extra EXTRA_DOCK_STATE:

Kotlin

    val dockState: Int = dockStatus?.getIntExtra(EXTRA_DOCK_STATE, -1) ?: -1
    val isDocked: Boolean = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED
    

Java

    int dockState = dockStatus.getIntExtra(EXTRA_DOCK_STATE, -1);
    boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
    

Determinar o tipo de base atual

Se um dispositivo está encaixado, isso pode acontecer em um dos quatro tipos diferentes de base:

  • Carro
  • Mesa
  • Mesa de baixa capacidade (analógica)
  • Mesa de alta capacidade (digital)

Observe que as duas últimas opções só foram introduzidas no Android no nível da API 11, portanto, é recomendado conferir todas as três opções quando o interesse for no tipo de base, e não em saber se ela é digital ou analógica especificamente:

Kotlin

    val isCar: Boolean = dockState == EXTRA_DOCK_STATE_CAR
    val isDesk: Boolean = dockState == EXTRA_DOCK_STATE_DESK
            || dockState == EXTRA_DOCK_STATE_LE_DESK
            || dockState == EXTRA_DOCK_STATE_HE_DESK
    

Java

    boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;
    boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK ||
                     dockState == EXTRA_DOCK_STATE_LE_DESK ||
                     dockState == EXTRA_DOCK_STATE_HE_DESK;