Table of Contents

Verificar a disponibilidade da sessão e o suporte do dispositivo

Antes de iniciar a AR, geralmente é necessário verificar se a sessão está disponível e se o dispositivo atual suporta os recursos de AR necessários. Este artigo descreve como realizar essas verificações.

Antes de começar

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

Se a sessão for iniciada diretamente após a montagem, o relatório da sessão pode ser obtido através do evento StateChanged.

A inscrição no evento StateChanged deve ser feita antes do início da sessão, geralmente sendo seguro fazer a inscrição no Awake():

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

No tratamento do evento, os estados da sessão que requerem atenção incluem: Ready e Broken. O estado Ready indica que a sessão foi iniciada com sucesso, significando que a sessão está disponível no dispositivo atual. O estado Broken indica falha na inicialização da sessão, significando que a sessão não está disponível no dispositivo atual.

O estado Broken nem sempre ocorre quando o dispositivo não é suportado. Portanto, o motivo específico da falha também deve ser obtido usando SessionReport.BrokenReason.

void HandleSessionStateChange(ARSession.SessionState status)
{
    if (status == ARSession.SessionState.Ready)
    {
        // session está disponível no dispositivo atual
    }
    else if (status == ARSession.SessionState.Broken)
    {
        // session não está disponível no dispositivo atual
        if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
            Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
        {
            // os componentes selecionados não são suportados pelo dispositivo atual
        }
        else
        {
            // razões não relacionadas ao dispositivo
        }
    }
}

As razões SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicam que os componentes da sessão não estão disponíveis no dispositivo atual; outras razões geralmente não estão relacionadas ao dispositivo. Estritamente falando, essas duas razões significam que a funcionalidade AR nesta configuração (e apenas esta configuração) não pode ser executada neste dispositivo. A configuração refere-se aos recursos e configurações selecionados no objeto de sessão. O relatório detalhado de disponibilidade pode ser obtido em Report.

No caso de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, se o dispositivo for suportado durante a atualização da lista de dispositivos com conexão à internet ao iniciar a sessão, a sessão pode ser recuperada automaticamente.

Obter relatório antes da inicialização

Se desejar determinar antes da inicialização da sessão e decidir se inicia ou não a sessão com base nas circunstâncias específicas, você pode chamar manualmente Assemble() e usar o evento AssembleUpdate para obter o relatório de disponibilidade de componentes.

A inscrição no evento AssembleUpdate deve ser feita antes da montagem da sessão,

Session.AssembleUpdate += OnAssembleUpdate;

Na primeira fase da montagem, ainda é possível usar ARSession.SessionState e Report para determinar o suporte da sessão. No entanto, o relatório da segunda fase não será atualizado na sessão.

Portanto, ao chamar manualmente Assemble(), geralmente é necessário processar o relatório de disponibilidade de componentes no evento AssembleUpdate para determinar se a sessão está disponível no dispositivo atual.

É importante focar na disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameSources. Se qualquer componente de fonte de frame estiver disponível, então a parte SessionReport.AvailabilityReport.FrameSources estará disponível no dispositivo atual.

Também é necessário focar na disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameFilters do relatório. No entanto, o critério de avaliação varia conforme as opções de montagem, exigindo que todos os frame filters estejam disponíveis, ou qualquer número de frame filters esteja disponível. Na opção padrão, todos os frame filters devem estar disponíveis.

Na configuração padrão, o seguinte código pode ser usado para determinar se os componentes da sessão 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 sessão estão disponíveis no dispositivo atual, pode iniciar a sessão
        Session.StartSession();
    }
    else
    {
        // os componentes da sessão não estão disponíveis no dispositivo atual
    }
    if (report.PendingDeviceList.Count <= 0)
    {
        Session.AssembleUpdate -= OnAssembleUpdate;
    }
}

Note que o evento AssembleUpdate pode ser acionado duas vezes. No exemplo de código acima, a inscrição no evento é cancelada após confirmar que os componentes estão disponíveis.

Este método de verificação não pode determinar outros erros que possam ocorrer durante a inicialização da sessão, mas esses erros geralmente não estão relacionados ao dispositivo. Se necessário, uma verificação adicional pode ser feita após iniciar a sessão através do evento StateChanged.

Opções quando os componentes da sessão não estão disponíveis

No desenvolvimento de aplicativos, geralmente deseja-se oferecer compatibilidade com o maior número possível de dispositivos. Portanto, quando os componentes da sessão não estão disponíveis no dispositivo atual, as seguintes opções podem ser consideradas:

  • Usar recursos de AR alternativos
    Modifique a configuração dos componentes da sessão para selecionar recursos de AR suportados pelo dispositivo atual. Consulte criar uma sessão para aprender como modificar a configuração dos componentes da sessão.

  • Fornecer uma experiência não-AR
    Quando os componentes da sessão não estão disponíveis, ofereça uma experiência não-AR. Por exemplo, em cenários de navegação, se a navegação AR não for possível, fornecer navegação 2D tradicional é muito útil.

  • Sugerir que o usuário troque de dispositivo
    Em alguns cenários de aplicativo, os usuários podem usar dispositivos que não suportam recursos de AR. Nesse caso, sugira que o usuário troque de dispositivo para uma melhor experiência.

Ao escolher essas soluções, pondere com base nos requisitos específicos do aplicativo e no perfil dos usuários. Em aplicativos AR, se alguns dispositivos realmente não puderem fornecer soluções AR ou alternativas, ainda é necessário fornecer uma boa mensagem de informação ao usuário para que ele compreenda as limitações do dispositivo atual.

Próximos passos