Ativar RA no seu app Android

Ative a RA para usar recursos de realidade aumentada no seu app novo ou atual.

Configurar seu app como "AR Required" ou "AR Optional"

Para economizar espaço em dispositivos individuais, todos os recursos de RA são armazenados em um app chamado Google Play Services para RA, que é atualizado separadamente pela Play Store. Os apps Android que usam recursos de RA se comunicam com o Google Play Services para RA usando o SDK do ARCore. Um app que oferece suporte a recursos de RA pode ser configurado de duas maneiras: RA obrigatório e RA opcional. Essa designação determina como o app de RA interage com o Google Play Services para RA.

Um app com RA obrigatório não funciona sem o ARCore. Ele exige um dispositivo compatível com o ARCore que tenha o Google Play Services para RA instalado.

  • A Google Play Store só disponibiliza apps que exigem RA em dispositivos compatíveis com o ARCore.
  • Quando os usuários instalam um app que exige RA, a Google Play Store instala automaticamente o Google Play Services para RA no dispositivo. No entanto, seu app ainda precisa realizar outras verificações de tempo de execução caso o Google Play Services para RA esteja desatualizado ou tenha sido desinstalado manualmente.

Um app RA opcional usa o ARCore para melhorar a funcionalidade atual. Ele tem recursos de RA opcionais que só são ativados em dispositivos compatíveis com o ARCore que têm o Google Play Services para RA instalado.

  • Os apps opcionais de RA podem ser instalados e executados em dispositivos que não são compatíveis com o ARCore.
  • Quando os usuários instalam um app opcional de RA, a Google Play Store não instala automaticamente o Google Play Services para RA no dispositivo.
RA obrigatóriaRA opcional
Uso do recurso de RA Seu app precisa do ARCore para funcionalidades básicas. O ARCore aumenta a funcionalidade do seu app. Seu app pode ser executado sem suporte do ARCore.
Visibilidade na Google Play Store O app só aparece na Google Play Store em dispositivos compatíveis com o ARCore. Seu app segue os procedimentos normais de informações do produto.
Método de instalação do Google Play Services para RA A Play Store instala o Google Play Services para RA junto com seu app. Seu app usa ArCoreApk.requestInstall() para fazer o download e instalar o ARCore.
Requisitos do Android minSdkVersion Android 7.0 (nível 24 da API) Android 4.4 (nível 19 da API), mas para executar qualquer funcionalidade de RA, é necessário pelo menos o Android 7.0 (nível 24 da API)
É necessário usar ArCoreApk.checkAvailability() ou ArCoreApk.checkAvailabilityAsync() para verificar a compatibilidade com o ARCore e o status da instalação.
É necessário usar ArCoreApk.requestInstall() para instalar o Google Play Services para RA

Para tornar seu app obrigatório ou opcional para RA, atualize o AndroidManifest.xml para incluir as seguintes entradas:

RA obrigatória

<uses-permission android:name="android.permission.CAMERA" />

<!-- Limits app visibility in the Google Play Store to ARCore supported devices
     (https://developers.google.com/ar/devices). -->
<uses-feature android:name="android.hardware.camera.ar" />

<application >
    

    <!-- "AR Required" app, requires "Google Play Services for AR" (ARCore)
         to be installed, as the app does not include any non-AR features. -->
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

RA opcional

<uses-permission android:name="android.permission.CAMERA" />

<!-- If your app was previously AR Required, don't forget to remove the
     `<uses-feature android:name="android.hardware.camera.ar" />` entry, as
     this would limit app visibility in the Google Play Store to only
     ARCore supported devices. -->

<application >
    

    <!-- "AR Optional" app, contains non-AR features that can be used when
         "Google Play Services for AR" (ARCore) is not available. -->
    <meta-data android:name="com.google.ar.core" android:value="optional" />
</application>

Em seguida, modifique o build.gradle do app para especificar um minSdkVersion de pelo menos 24:

 android {
     defaultConfig {
         
         minSdkVersion 24
     }
 }

Adicionar dependências de compilação

Para adicionar o ARCore ao seu projeto do Android Studio, faça o seguinte:

  1. Verifique se o arquivo build.gradle do projeto inclui o repositório Maven do Google.

    allprojects {
        repositories {
            google()
            
        }
    }
    
  2. Adicione a biblioteca ARCore mais recente como uma dependência no arquivo build.gradle do app.

    dependencies {
        
        implementation 'com.google.ar:core:1.33.0'
    }
    

Realizar verificações de tempo de execução

Durante a execução, faça o seguinte para garantir que os recursos de RA no seu app funcionem sem problemas.

Verificar se o ARCore é compatível

Os apps que exigem e os que não exigem RA precisam usar ArCoreApk.checkAvailability() ou ArCoreApk.checkAvailabilityAsync() para determinar se o dispositivo atual é compatível com o ARCore. Em dispositivos sem suporte para o ARCore, os apps precisam desativar a funcionalidade relacionada à RA e ocultar os elementos da interface associados.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  // Enable AR-related functionality on ARCore supported devices only.
  maybeEnableArButton()
  
}

fun maybeEnableArButton() {
  ArCoreApk.getInstance().checkAvailabilityAsync(this) { availability ->
    if (availability.isSupported) {
      mArButton.visibility = View.VISIBLE
      mArButton.isEnabled = true
    } else { // The device is unsupported or unknown.
      mArButton.visibility = View.INVISIBLE
      mArButton.isEnabled = false
    }
  }
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Enable AR-related functionality on ARCore supported devices only.
  maybeEnableArButton();
  
}

void maybeEnableArButton() {
  ArCoreApk.getInstance().checkAvailabilityAsync(this, availability -> {
    if (availability.isSupported()) {
      mArButton.setVisibility(View.VISIBLE);
      mArButton.setEnabled(true);
    } else { // The device is unsupported or unknown.
      mArButton.setVisibility(View.INVISIBLE);
      mArButton.setEnabled(false);
    }
  });
}
Mesmo que o Google Play Services para RA seja instalado junto com o app que exige RA, os usuários com dispositivos não compatíveis podem instalá-lo de uma fonte externa. Usar ArCoreApk.checkAvailability() ou ArCoreApk.checkAvailabilityAsync() para verificar a compatibilidade com o ARCore garante uma experiência consistente.

O ArCoreApk.checkAvailability() pode precisar consultar recursos de rede para determinar se o dispositivo é compatível com o ARCore. Durante esse período, ele vai retornar UNKNOWN_CHECKING. Para reduzir a latência percebida e o pop-in, os apps precisam chamar ArCoreApk.checkAvailability() uma vez no início do ciclo de vida para iniciar a consulta, ignorando o valor retornado. Assim, um resultado armazenado em cache fica disponível imediatamente quando um elemento da interface para entrar em RA pode ser exibido.

Verificar se o Google Play Services para RA está instalado

Os apps que exigem e os que não exigem RA precisam usar ArCoreApk.requestInstall() antes de criar uma sessão do ARCore para verificar se uma versão compatível do Google Play Services para RA está (ainda) instalada e garantir que todos os dados necessários do perfil do dispositivo ARCore foram baixados.

Kotlin

// requestInstall(Activity, true) will triggers installation of
// Google Play Services for AR if necessary.
var mUserRequestedInstall = true

override fun onResume() {
  super.onResume()

  // Check camera permission.
  

  // Ensure that Google Play Services for AR and ARCore device profile data are
  // installed and up to date.
  try {
    if (mSession == null) {
      when (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) {
        ArCoreApk.InstallStatus.INSTALLED -> {
          // Success: Safe to create the AR session.
          mSession = Session(this)
        }
        ArCoreApk.InstallStatus.INSTALL_REQUESTED -> {
          // When this method returns `INSTALL_REQUESTED`:
          // 1. ARCore pauses this activity.
          // 2. ARCore prompts the user to install or update Google Play
          //    Services for AR (market://details?id=com.google.ar.core).
          // 3. ARCore downloads the latest device profile data.
          // 4. ARCore resumes this activity. The next invocation of
          //    requestInstall() will either return `INSTALLED` or throw an
          //    exception if the installation or update did not succeed.
          mUserRequestedInstall = false
          return
        }
      }
    }
  } catch (e: UnavailableUserDeclinedInstallationException) {
    // Display an appropriate message to the user and return gracefully.
    Toast.makeText(this, "TODO: handle exception " + e, Toast.LENGTH_LONG)
        .show()
    return
  } catch () {
    
    return  // mSession remains null, since session creation has failed.
  }
  
}

Java

// requestInstall(Activity, true) will trigger installation of
// Google Play Services for AR if necessary.
private boolean mUserRequestedInstall = true;

@Override
protected void onResume() {
  super.onResume();

  // Check camera permission.
  

  // Ensure that Google Play Services for AR and ARCore device profile data are
  // installed and up to date.
  try {
    if (mSession == null) {
      switch (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) {
        case INSTALLED:
          // Success: Safe to create the AR session.
          mSession = new Session(this);
          break;
        case INSTALL_REQUESTED:
          // When this method returns `INSTALL_REQUESTED`:
          // 1. ARCore pauses this activity.
          // 2. ARCore prompts the user to install or update Google Play
          //    Services for AR (market://details?id=com.google.ar.core).
          // 3. ARCore downloads the latest device profile data.
          // 4. ARCore resumes this activity. The next invocation of
          //    requestInstall() will either return `INSTALLED` or throw an
          //    exception if the installation or update did not succeed.
          mUserRequestedInstall = false;
          return;
      }
    }
  } catch (UnavailableUserDeclinedInstallationException e) {
    // Display an appropriate message to the user and return gracefully.
    Toast.makeText(this, "TODO: handle exception " + e, Toast.LENGTH_LONG)
        .show();
    return;
  } catch () {
    
    return;  // mSession remains null, since session creation has failed.
  }
  
}

Solicitar permissão da câmera

Os apps de RA opcional e obrigatória precisam garantir que a permissão da câmera foi concedida antes de criar uma sessão de RA.

Kotlin

override fun onResume() {
  super.onResume()

  // ARCore requires camera permission to operate.
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    CameraPermissionHelper.requestCameraPermission(this)
    return
  }

  
}

Java

@Override
protected void onResume() {
  super.onResume();

  // ARCore requires camera permission to operate.
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    CameraPermissionHelper.requestCameraPermission(this);
    return;
  }

  
}

Sua atividade de RA também precisa implementar onRequestPermissionsResult().

Kotlin

override fun onRequestPermissionsResult(
  requestCode: Int,
  permissions: Array<String>,
  results: IntArray
) {
  super.onRequestPermissionsResult(requestCode, permissions, results)
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG)
      .show()
    if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)) {
      // Permission denied with checking "Do not ask again".
      CameraPermissionHelper.launchPermissionSettings(this)
    }
    finish()
  }
}

Java

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) {
  super.onRequestPermissionsResult(requestCode, permissions, results);
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG)
        .show();
    if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)) {
      // Permission denied with checking "Do not ask again".
      CameraPermissionHelper.launchPermissionSettings(this);
    }
    finish();
  }
}

Cumpra os requisitos de privacidade do usuário

Para publicar seu app na Google Play Store, verifique se ele está em conformidade com os requisitos de privacidade do usuário do ARCore.

Próximas etapas