Table of Contents

Verificare la disponibilità della session e il supporto del dispositivo

Prima di avviare l'AR, di solito bisogna prima verificare se la session è disponibile e se il dispositivo corrente supporta le funzioni AR necessarie. Questo articolo spiega come eseguire questi controlli.

Prima di iniziare

Ottenere il report durante il flusso di avvio

Se la session viene avviata direttamente dopo l'assemble, puoi ottenere il report della session tramite l'evento StateChanged.

Bisogna iscriversi all'evento StateChanged prima di avviare la session; di solito è sicuro farlo in Awake():

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

Gli stati della session da monitorare nel gestore dell'evento sono Ready e Broken. Lo stato Ready indica che la session è stata avviata correttamente, quindi che è disponibile sul dispositivo corrente. Lo stato Broken indica che l'avvio è fallito, quindi che la session non è disponibile sul dispositivo corrente.

Lo stato Broken non compare sempre quando il dispositivo non è supportato. Per questo serve anche SessionReport.BrokenReason per ottenere la causa esatta del fallimento.

void HandleSessionStateChange(ARSession.SessionState status)
{
    if (status == ARSession.SessionState.Ready)
    {
        // session disponibile sul dispositivo corrente
    }
    else if (status == ARSession.SessionState.Broken)
    {
        // session non disponibile sul dispositivo corrente
        if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
            Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
        {
            // il componente scelto non è supportato dal dispositivo corrente
        }
        else
        {
            // causa non legata al dispositivo
        }
    }
}

Le cause SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicano che i componenti della session non sono disponibili sul dispositivo corrente; le altre cause sono in genere indipendenti dal dispositivo. In senso stretto, queste due cause significano che la configurazione attuale, e solo quella configurazione, non può eseguire le funzioni AR su quel dispositivo. La configurazione si riferisce alle funzioni e alle impostazioni scelte nell'oggetto session. Puoi ottenere un report di disponibilità dettagliato da Report.

Nel caso di SessionReport.SessionBrokenReason.NoAvailabileFrameSource, se durante l'avvio della session un aggiornamento online dell'elenco dei dispositivi rileva che il dispositivo è già supportato, la session può riprendersi automaticamente.

Ottenere il report prima dell'avvio

Se vuoi decidere prima che la session parta e stabilire se avviarla o no a seconda del caso, puoi chiamare manualmente Assemble() e usare l'evento AssembleUpdate per ottenere il report di disponibilità dei componenti.

Bisogna iscriversi all'evento AssembleUpdate prima dell'assemble della session.

Session.AssembleUpdate += OnAssembleUpdate;

Nella prima fase dell'assemble puoi ancora usare ARSession.SessionState e Report per valutare se la session è supportata. Ma il report della seconda fase non viene aggiornato nella session.

Perciò, quando si chiama manualmente Assemble(), di solito bisogna gestire il report di disponibilità nell'evento AssembleUpdate per capire se la session è disponibile sul dispositivo corrente.

Bisogna prestare particolare attenzione alla disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameSources. Se almeno un componente frame source è disponibile, la parte SessionReport.AvailabilityReport.FrameSources è disponibile sul dispositivo corrente.

Bisogna anche osservare la disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameFilters. Il criterio però dipende dalle opzioni di assemble: può essere richiesto che tutte le frame filter siano disponibili, oppure solo una parte di esse. Con le opzioni predefinite, tutte le frame filter devono essere disponibili.

Con la configurazione predefinita, puoi usare il seguente codice per verificare se i componenti della session sono disponibili sul dispositivo corrente:

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;
        // i componenti della session sono disponibili sul dispositivo corrente, si può avviare la session
        Session.StartSession();
    }
    else
    {
        // i componenti della session non sono disponibili sul dispositivo corrente
    }
    if (report.PendingDeviceList.Count <= 0)
    {
        Session.AssembleUpdate -= OnAssembleUpdate;
    }
}

Nota che l'evento AssembleUpdate può essere attivato due volte. Nell'esempio sopra, l'evento viene annullato dopo aver confermato che i componenti sono disponibili.

Questo metodo non può rilevare altri errori possibili durante l'avvio della session, ma tali errori sono di solito indipendenti dal dispositivo. Se serve, puoi integrare il controllo dopo l'avvio usando l'evento StateChanged.

Cosa fare quando i componenti della session non sono disponibili

Nello sviluppo di applicazioni, di solito si vuole supportare il maggior numero possibile di dispositivi. Quando i componenti della session non sono disponibili sul dispositivo corrente, puoi valutare queste opzioni:

  • Passare ad altre funzioni AR
    Modificando la configurazione dei componenti della session, scegli le funzioni AR supportate dal dispositivo corrente. Consulta creare una session per vedere come modificare la configurazione.

  • Offrire un'esperienza non AR
    Quando i componenti della session non sono disponibili, offri un'esperienza senza AR. Per esempio, in uno scenario di navigazione, se la navigazione AR non è possibile, una navigazione 2D tradizionale è molto utile.

  • Invitare l'utente a cambiare dispositivo
    In alcuni scenari, l'utente può usare un dispositivo che non supporta le funzioni AR. In quel caso, puoi suggerire di cambiare dispositivo per ottenere una migliore esperienza.

Quando scegli queste opzioni, puoi valutarle in base ai requisiti dell'app e al pubblico di riferimento. In un'app AR, se alcuni dispositivi non possono davvero offrire AR o una soluzione degradante, è comunque importante mostrare un buon messaggio all'utente per fargli capire i limiti del dispositivo.

Passi successivi