מפעילים את המציאות הרבודה כדי להשתמש בתכונות של מציאות רבודה באפליקציה החדשה או הקיימת.
הגדרת האפליקציה כחובה עם AR או כאופציונלית עם AR
כדי לחסוך מקום במכשירים מסוימים, כל תכונות ה-AR מאוחסנות באפליקציה שנקראת Google Play Services למציאות רבודה, שמתעדכנת בנפרד על ידי חנות Play. אפליקציות Android שמשתמשות בתכונות AR מתקשרות עם שירותי Google Play למציאות רבודה באמצעות ARCore SDK. אפשר להגדיר אפליקציה שתומכת בתכונות AR בשתי דרכים: חובה להשתמש ב-AR ואופציונלי להשתמש ב-AR. הסיווג הזה קובע את אופן האינטראקציה של האפליקציה עם אפליקציית 'Google Play Services למציאות רבודה'.
אפליקציה עם התווית נדרשת AR לא יכולה לפעול בלי ARCore. כדי להשתמש בה, צריך מכשיר נתמך של ARCore שבו מותקנים שירותי Google Play למציאות רבודה.
- אפליקציות עם דרישת AR יהיו זמינות בחנות Google Play רק במכשירים שתומכים ב-ARCore.
- כשמשתמשים מתקינים אפליקציה עם דרישת AR, שירותי Google Play למציאות רבודה מותקנים באופן אוטומטי במכשיר שלהם דרך חנות Google Play. עם זאת, האפליקציה עדיין צריכה לבצע בדיקות נוספות בסביבת זמן הריצה למקרה ש-Google Play Services for AR לא מעודכן או שהושבת באופן ידני.
אפליקציה עם אפשרות לשימוש ב-AR משתמשת ב-ARCore כדי לשפר את הפונקציונליות הקיימת. יש בה תכונות AR אופציונליות שמופעלות רק במכשירים נתמכים של ARCore שמותקן בהם Google Play Services למציאות רבודה.
- אפשר להתקין אפליקציות AR אופציונליות ולהריץ אותן במכשירים שלא תומכים ב-ARCore.
- כשמשתמשים מתקינים אפליקציה אופציונלית עם AR, לא מתבצעת התקנה אוטומטית של Google Play Services למציאות רבודה במכשיר דרך חנות Google Play.
חובה להשתמש ב-AR | AR אופציונלי | |
---|---|---|
שימוש בתכונת ה-AR | כדי שהאפליקציה תפעל באופן בסיסי, היא צריכה את ARCore. | ARCore משפר את הפונקציונליות של האפליקציה. האפליקציה יכולה לפעול בלי תמיכה ב-ARCore. |
החשיפה בחנות Play | האפליקציה מופיעה בחנות Play רק במכשירים שתומכים ב-ARCore. | האפליקציה עומדת בנוהלי ההוספה הרגילים. |
שיטת ההתקנה של שירותי Google Play למציאות רבודה | חנות Play מתקינה את Google Play Services למציאות רבודה לצד האפליקציה. | האפליקציה משתמשת ב-
ArCoreApk.requestInstall()
כדי להוריד ולהתקין את ARCore. |
דרישות ל-minSdkVersion ב-Android |
Android 7.0 (רמת API 24) | Android 4.4 (רמת API 19), אבל כדי להפעיל פונקציונליות של AR צריך לפחות Android 7.0 (רמת API 24) |
צריך להשתמש ב-ArCoreApk.checkAvailability() או ב-ArCoreApk.checkAvailabilityAsync() כדי לבדוק את התמיכה ב-ARCore ואת סטטוס ההתקנה
|
||
צריך להשתמש ב-
ArCoreApk.requestInstall()
כדי להתקין את Google Play Services למציאות רבודה |
כדי להגדיר את האפליקציה כחובה לשימוש ב-AR או כאופציונלית לשימוש ב-AR, מעדכנים את AndroidManifest.xml
כך שיכלול את הרשומות הבאות:
<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>
<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
של האפליקציה כך שיציין minSdkVersion
של לפחות 24
:
android {
defaultConfig {
…
minSdkVersion 24
}
}
הוספת יחסי תלות ב-build
כדי להוסיף את ARCore לפרויקט ב-Android Studio:
מוודאים שקובץ
build.gradle
של הפרויקט כולל את מאגר Maven של Google.allprojects { repositories { google() … } }
מוסיפים את ספריית ARCore העדכנית ביותר כיחס תלות בקובץ
build.gradle
של האפליקציה.dependencies { … implementation 'com.google.ar:core:1.33.0' }
ביצוע בדיקות בזמן ריצה
במהלך זמן הריצה, יש לבצע את הפעולות הבאות כדי לוודא שתכונות ה-AR באפליקציה פועלות בצורה חלקה.
איך בודקים אם המכשיר תומך ב-ARCore
גם אפליקציות עם מציאות רבודה כחובה וגם אפליקציות עם מציאות רבודה כאופציונלי צריכות להשתמש ב-ArCoreApk.checkAvailability()
או ב-ArCoreApk.checkAvailabilityAsync()
כדי לקבוע אם המכשיר הנוכחי תומך ב-ARCore. במכשירים שלא תומכים ב-ARCore, האפליקציות צריכות להשבית את הפונקציונליות שקשורה ל-AR ולהסתיר את רכיבי ממשק המשתמש המשויכים.
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
}
}
}
@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()
פעם אחת בשלב מוקדם במחזור החיים שלהן כדי להתחיל את השאילתה, בלי להתחשב בערך המוחזר. כך, תוצאה ששמורה במטמון תהיה זמינה באופן מיידי כשרכיב ממשק משתמש שמוצג ב-AR עשוי להופיע.
בודקים אם שירותי Google Play למציאות רבודה מותקנים
גם אפליקציות עם דרישה ל-AR וגם אפליקציות עם אפשרות ל-AR חייבות להשתמש ב-
ArCoreApk.requestInstall()
לפני יצירת סשן ARCore כדי לבדוק אם (עדיין) מותקנת גרסה תואמת של שירותי Google Play למציאות רבודה, וכדי לוודא שכל נתוני פרופיל המכשיר הנדרשים ל-ARCore הורדתם.
// 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.
}
…
}
// 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 אופציונלי וגם אפליקציות עם AR חובה צריכות לוודא שהמשתמשים העניקו הרשאת גישה למצלמה לפני יצירת סשן AR.
override fun onResume() {
super.onResume()
// ARCore requires camera permission to operate.
if (!CameraPermissionHelper.hasCameraPermission(this)) {
CameraPermissionHelper.requestCameraPermission(this)
return
}
…
}
@Override
protected void onResume() {
super.onResume();
// ARCore requires camera permission to operate.
if (!CameraPermissionHelper.hasCameraPermission(this)) {
CameraPermissionHelper.requestCameraPermission(this);
return;
}
…
}
בנוסף, הפעילות שלכם ב-AR צריכה ליישם את onRequestPermissionsResult()
.
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()
}
}
@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 Store, חשוב לוודא שהיא עומדת בדרישות של ARCore בנושא פרטיות המשתמשים.