Table of Contents

Verificar a disponibilidade da session e o suporte do dispositivo

Antes de iniciar o AR, normalmente é preciso primeiro verificar se a session está disponível e se o dispositivo atual suporta as funções AR necessárias. Este artigo explica como fazer essas verificações.

Antes de começar

Obter o relatório durante o fluxo de inicialização

Se a session for iniciada diretamente depois do assemble, você pode obter o relatório da session pelo evento StateChanged.

É preciso assinar o evento StateChanged antes do session start; normalmente é seguro fazer isso em Awake():

void Awake()
{
    Session.StateChanged += HandleSessionStateChange;
}

Os estados de session a observar no handler do evento são Ready e Broken. O estado Ready indica que a session foi iniciada com sucesso, ou seja, que está disponível no dispositivo atual. O estado Broken indica que a inicialização falhou, ou seja, que a session não está disponível no dispositivo atual.

O estado Broken nem sempre aparece quando o dispositivo não é suportado. Por isso, também é necessário usar SessionReport.BrokenReason para obter o motivo exato da falha.

void HandleSessionStateChange(ARSession.SessionState status)
{
    if (status == ARSession.SessionState.Ready)
    {
        // session disponível no dispositivo atual
    }
    else if (status == ARSession.SessionState.Broken)
    {
        // session indisponível no dispositivo atual
        if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
            Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
        {
            // o componente selecionado não é suportado pelo dispositivo atual
        }
        else
        {
            // motivo não relacionado ao dispositivo
        }
    }
}

As causas SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicam que os componentes da session não estão disponíveis no dispositivo atual; as outras causas normalmente não dependem do dispositivo. Em termos estritos, essas duas causas significam que a configuração atual, e apenas ela, não pode executar funções AR naquele dispositivo. Configuração refere-se às funções e ajustes escolhidos no objeto session. É possível obter um relatório detalhado de disponibilidade em Report.

No caso de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, se durante a inicialização da session houver atualização online da lista de dispositivos e o dispositivo for detectado como suportado, a session pode se recuperar automaticamente.

Obter o relatório antes de iniciar

Se quiser decidir antes de a session iniciar e, conforme o caso, escolher se deve iniciá-la, você pode chamar manualmente Assemble() e usar o evento AssembleUpdate para obter o relatório de disponibilidade dos componentes.

É preciso assinar o evento AssembleUpdate antes do assemble da session.

Session.AssembleUpdate += OnAssembleUpdate;

Na primeira fase do assemble, ainda é possível usar ARSession.SessionState e Report para julgar se a session é suportada. Mas o relatório da segunda fase não é atualizado na session.

Por isso, quando se chama Assemble() manualmente, normalmente é preciso tratar o relatório de disponibilidade no evento AssembleUpdate para determinar se a session está disponível no dispositivo atual.

É preciso prestar atenção principalmente à disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameSources. Se pelo menos um frame source estiver disponível, então a parte SessionReport.AvailabilityReport.FrameSources está disponível no dispositivo atual.

Também é preciso observar a disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameFilters. Porém o critério muda conforme as opções de assemble: pode ser exigido que todos os frame filters estejam disponíveis, ou apenas alguns. Na opção padrão, todos os frame filters precisam estar disponíveis.

Na configuração padrão, você pode usar o código abaixo para verificar se os componentes da session estão disponíveis no dispositivo atual:

void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
    if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
        report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
    {
        Session.AssembleUpdate -= OnAssembleUpdate;
        // os componentes da session estão disponíveis no dispositivo atual, a session pode ser iniciada
        Session.StartSession();
    }
    else
    {
        // os componentes da session não estão disponíveis no dispositivo atual
    }
    if (report.PendingDeviceList.Count <= 0)
    {
        Session.AssembleUpdate -= OnAssembleUpdate;
    }
}

Observe que o evento AssembleUpdate pode disparar duas vezes. No exemplo acima, a inscrição é removida depois de confirmar que os componentes estão disponíveis.

Esse método não consegue detectar outros erros que possam ocorrer durante a inicialização da session, mas esses erros normalmente não dependem do dispositivo. Se necessário, você pode complementar a verificação após iniciar a session pelo evento StateChanged.

O que fazer quando os componentes da session não estão disponíveis

No desenvolvimento de aplicativos, normalmente se quer suportar o maior número possível de dispositivos. Quando os componentes da session não estiverem disponíveis no dispositivo atual, você pode considerar estas opções:

  • Fazer downgrade para outras funções AR
    Ao modificar a configuração dos componentes da session, escolha as funções AR suportadas pelo dispositivo atual. Consulte criar uma session para ver como alterar a configuração.

  • Oferecer uma experiência não AR
    Quando os componentes da session não estiverem disponíveis, ofereça uma experiência sem AR. Por exemplo, em um cenário de navegação, se a navegação AR não for possível, uma navegação 2D tradicional é muito útil.

  • Pedir para o usuário trocar de dispositivo
    Em alguns cenários, o usuário pode estar usando um dispositivo que não suporta funções AR. Nesse caso, você pode sugerir trocar de dispositivo para obter uma experiência melhor.

Ao escolher essas opções, avalie os requisitos específicos do aplicativo e o público-alvo. Em um aplicativo AR, se alguns dispositivos realmente não puderem oferecer AR ou um modo degradado, ainda assim é importante exibir uma boa mensagem para que o usuário entenda as limitações do dispositivo.

Próximos passos