AR を有効にすると、新規または既存のアプリで拡張現実機能を利用できます。
AR 対応を必須または AR オプションにアプリを設定する
個々のデバイスの容量を節約するため、すべての AR 機能は Google Play 開発者サービス(AR)というアプリに保存されます。このアプリは Google Play ストアで別途更新されます。AR 機能を使用する Android アプリは、ARCore SDK を使用して Google Play 開発者サービス(AR)と通信します。AR 機能をサポートするアプリは、[AR 対応が必要] と [AR オプション] の 2 つの方法で設定できます。この指定により、アプリが AR 用 Google Play 開発者サービス アプリとどのようにやり取りするかが決まります。
[AR 必須] アプリは ARCore なしでは機能しません。Google Play 開発者サービス(AR)がインストールされた ARCore 対応デバイスが必要です。
- Google Play ストアでは、ARCore をサポートするデバイスでのみ AR 対応アプリを利用できます。
- ユーザーが AR 必須アプリをインストールすると、Google Play ストアからユーザーのデバイスに Google Play 開発者サービス(AR)が自動的にインストールされます。ただし、Google Play 開発者サービス(AR)が古い場合や手動でアンインストールした場合は、アプリで追加のランタイム チェックを行う必要があります。
AR Optional アプリは、ARCore を使用して既存の機能を強化しています。これには、Google Play 開発者サービス(AR)がインストールされている ARCore 対応デバイスでのみ有効になる、オプションの AR 機能があります。
- AR Optional アプリは、ARCore をサポートしていないデバイスにインストールして実行できます。
- ユーザーが AR Optional アプリをインストールしても、Google Play ストアからデバイスに AR 用 Google Play 開発者サービスが自動的にインストールされることはありません。
AR が必要 | AR(オプション) | |
---|---|---|
AR 機能の使用 | アプリの基本機能には ARCore が必要です。 | ARCore はアプリの機能を強化します。ARCore サポートなしでもアプリを実行できます。 |
Google Play ストアの公開設定 | Google Play ストアに、ARCore をサポートするデバイスでのみアプリが掲載されている。 | アプリは通常の掲載手順に沿っています。 |
AR 用 Google Play 開発者サービスのインストール方法 | Google Play ストアにより、アプリとともに Google Play 開発者サービス(AR)がインストールされます。 | アプリは
ArCoreApk.requestInstall()
を使用して ARCore をダウンロードしてインストールします。 |
Android の minSdkVersion の要件 |
Android 7.0(API レベル 24) | Android 4.4(API レベル 19)。AR 機能を実行するには、Android 7.0(API レベル 24)以上が必要です。 |
ARCore のサポートとインストールのステータスを確認するには、ArCoreApk.checkAvailability() または ArCoreApk.checkAvailabilityAsync() を使用する必要があります
|
||
Google Play 開発者サービス(AR)をインストールするには、
ArCoreApk.requestInstall()
を使用する必要があります。 |
アプリを AR 必須または AR オプションにするには、AndroidManifest.xml
を更新して次のエントリを追加します。
AR が必要
<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>
AR(オプション)
<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>
次に、アプリの build.gradle
を変更して、24
以上の minSdkVersion
を指定します。
android {
defaultConfig {
…
minSdkVersion 24
}
}
ビルド依存関係を追加する
Android Studio プロジェクトに ARCore を追加する手順は次のとおりです。
プロジェクトの
build.gradle
ファイルに Google の Maven リポジトリが含まれていることを確認します。allprojects { repositories { google() … } }
アプリの
build.gradle
ファイルに、最新の ARCore ライブラリを依存関係として追加します。dependencies { … implementation 'com.google.ar:core:1.33.0' }
ランタイム チェックを実行する
アプリの AR 機能がスムーズに実行されるように、実行時に以下を行います。
ARCore がサポートされているかどうかを確認する
AR 必須アプリと AR オプションアプリの両方で、ArCoreApk.checkAvailability()
または ArCoreApk.checkAvailabilityAsync()
を使用して、現在のデバイスが ARCore をサポートしているかどうかを判断する必要があります。ARCore をサポートしていないデバイスでは、アプリは AR 関連の機能を無効にし、関連する UI 要素を非表示にする必要があります。
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);
}
});
}
ArCoreApk.checkAvailability()
または ArCoreApk.checkAvailabilityAsync()
を使用して ARCore に対応しているかどうかを確認し、一貫性のあるエクスペリエンスを実現します。
ArCoreApk.checkAvailability()
は、デバイスが ARCore をサポートしているかどうかを判断するために、ネットワーク リソースへのクエリが必要になることがあります。この期間中は UNKNOWN_CHECKING
が返されます。認識されるレイテンシとポップインを減らすには、アプリはライフサイクルの早い段階で ArCoreApk.checkAvailability()
を 1 回呼び出してクエリを開始する必要があります。戻り値は無視されます。このようにして、AR 入力の UI 要素が表示される可能性があるときに、キャッシュされた結果をすぐに利用できます。
Google Play 開発者サービス(AR)がインストールされているかどうかを確認する
AR 必須アプリと AR オプションアプリはどちらも、ARCore セッションを作成する前に
ArCoreApk.requestInstall()
を使用して、互換性のあるバージョンの Google Play 開発者サービス(AR)が(まだ)インストールされていることを確認し、必要な ARCore デバイス プロファイル データがすべてダウンロードされていることを確認する必要があります。
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.
}
…
}
カメラの権限をリクエストする
AR Optional と AR Required のアプリでは、AR セッションを作成する前に、カメラの権限が付与されていることを確認する必要があります。
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;
}
…
}
AR アクティビティには 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();
}
}
ユーザーのプライバシー要件を遵守する
Play ストアでアプリを公開するには、アプリが ARCore のユーザー プライバシー要件を遵守していることをご確認ください。
次のステップ
- ARCore セッションを構成する方法を確認する。