민프
[Android][ARcore - 2] 초기설정, GooglePlay ARCore 지원 여부 확인 본문
저번 포스트에서는 ARcore 예제를 해보았는데
이번 포스트에서는 ARCore의 초기설정, 각 기기마다 ARCore를 지원하는지 확인 여부를 알아보는 코드를 알아보아야겠다.
https://developers.google.com/ar/develop/java/enable-arcore#ar-required_1
1. ARcore기기 확인
https://developers.google.com/ar/devices
여기에 들어가서 지원하는 장치의 스펙 및 버전을 확인하면 될 것 같다
2. Google play ARcore 설치 확인
Google Play 서비스가 설치되어있는지 확인!
해당하는 기기의 Google play AR서비스 설치 유무 판단은
ArCoreApk.checkAvailability() | ARCore 지원 및 설치 상태를 확인 하는 데 사용해야 합니다. |
ArCoreApk.requestInstall() | AR용 Google Play 서비스를 설치 하는 데 사용해야 합니다. |
이 코드로 판단할 수 있다.
3. 앱의 매니페스트, build.gradle에 항목 추가 및 수정하기
- AndroidManifext에 다음 항목을 추가하자
AndroidManifext.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>
- ARcore를 하기 위해서는 적어도 minSdkVersion이 24이어야 한다.
android {
defaultConfig {
…
minSdkVersion 24
}
}
4. 빌드 종속성 추가
- 프로젝트 수준의 build.gradle 파일에 Google의 Maven 저장소가 포함되어 있는지 확인
allprojects { repositories { google() … } }
- 앱 수준의 bulid.grable파일에 ARcore 라이브러리를 종속 항목으로 추가!
dependencies {
…
implementation 'com.google.ar:core:1.25.0'
}
5. ARcore 지원 여부 확인
AR 필수 앱 과 AR 선택 앱 모두 ArCoreApk.checkAvailability() 현재 기기가 ARCore를 지원하는지 확인하는 데 사용해야 합니다. ARCore를 지원하지 않는 기기에서 앱은 AR 관련 기능을 비활성화하고 관련 UI 요소를 숨겨야 합니다.
ArCoreApk.checkAvailability()
현재 장치에서 ARCore이 지원되는지 확인하고 아래 값을 반환한다.
결론적으로 ArCoreApk.Availability SUPPORTED_INSTALLED 이 값이 나와야 ARCore APK가 있음을 나타낸다.
만약 ARCore APK가 호환되지 않는 기기에 된 경우 세션 생성이 계속 실패될 수 있다.
지원됨 _ APK _ 너무 _ 오래됨
public static final ArCoreApk.Availability SUPPORTED_APK_TOO_OLD
기기 및 Android 버전이 지원되며 ARCore APK 버전이 설치되어 있지만 해당 ARCore APK 버전이 너무 오래되었습니다.
공개 정적 최종 ArCoreApk . 가용성 지원 _ 설치됨
지원됨 _ 설치됨
public static final ArCoreApk.Availability SUPPORTED_INSTALLED
ARCore가 지원되고 설치되어 사용 가능합니다.
공개 정적 최종 ArCoreApk . 가용성 지원 _ NOT _ INSTALLED
지원됨 _ 아님 _ 설치됨
public static final ArCoreApk.Availability SUPPORTED_NOT_INSTALLED
기기 및 Android 버전이 지원되지만 ARCore APK가 설치되어 있지 않습니다.
공개 정적 최종 ArCoreApk . 가용성 UNKNOWN _ CHECKING
UNKNOWN _ CHECKING
public static final ArCoreApk.Availability UNKNOWN_CHECKING
ARCore가 설치되지 않았으며 ARCore가 지원되는지 확인하기 위한 쿼리가 실행되었습니다.
공개 정적 최종 ArCoreApk . 가용성 알 수 없음 _ 오류
알 수 없음 _ 오류
public static final ArCoreApk.Availability UNKNOWN_ERROR
ARCore 가용성을 확인하는 동안 내부 오류가 발생했습니다. 자세한 내용은 logcat을 확인하십시오.
공개 정적 최종 ArCoreApk . 가용성 알 수 없음 _ 시간 초과 _ OUT
알 수 없음 _ 시간 초과 _ OUT
public static final ArCoreApk.Availability UNKNOWN_TIMED_OUT
ARCore가 설치되어 있지 않고 ARCore가 지원되는지 확인하는 쿼리가 시간 초과되었습니다. 기기가 오프라인 상태이기 때문일 수 있습니다.
공개 정적 최종 ArCoreApk . 가용성 지원되지 않음 _ DEVICE _ NOT _ CAPABLE
지원되지 않는 _ 장치 _ 하지 _ 있는 선수
public static final ArCoreApk.Availability UNSUPPORTED_DEVICE_NOT_CAPABLE
ARCore는 이 기기에서 지원되지 않습니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Enable AR-related functionality on ARCore supported devices only.
maybeEnableArButton();
…
}
void maybeEnableArButton() {
ArCoreApk.Availability availability = ArCoreApk.getInstance().checkAvailability(this);
if (availability.isTransient()) {
// Continue to query availability at 5Hz while compatibility is checked in the background.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
maybeEnableArButton();
}
}, 200);
}
if (availability.isSupported()) {
mArButton.setVisibility(View.VISIBLE);
mArButton.setEnabled(true);
} else { // The device is unsupported or unknown.
mArButton.setVisibility(View.INVISIBLE);
mArButton.setEnabled(false);
}
}
6. 카메라 권한 요청
권한 요청은 샘플에 있는
CameraPermissionHelper.java를 이용하여 권한 요청을 받을 것 이다.
@Override
protected void onResume() {
super.onResume();
// ARCore requires camera permission to operate.
if (!CameraPermissionHelper.hasCameraPermission(this)) {
CameraPermissionHelper.requestCameraPermission(this);
return;
}
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.
}
…
}
@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();
}
}
이렇게 해주면 해당하는 장치가 Google Play ARCore 설치 여부 및 카메라 권한요청을 마치게 된다.
다음으로는 ARCore 샘플 코드를 보면서 나에게 필요한 코드들은 어떤 것들이 있는지 살펴보아야겠다.
----------참고----------
https://developers.google.com/ar/develop/java/enable-arcore#ar-required_1
'[Android]' 카테고리의 다른 글
[Android][CameraX - 2] Camera를 이용해서 얼굴을 캡쳐해보자! (0) | 2021.07.26 |
---|---|
[Android][CameraX - 1] 얼굴을 비춰줄 Camera PreView를 구현해보자!! (0) | 2021.07.26 |
[Android][ARcore - 1] ARcore 예제를 해보자!! (0) | 2021.07.24 |
[Android] SDK, NDK, PDK 란? (0) | 2021.07.17 |
[Android][WebRTC] 1. WebRTC란 무엇일까? (0) | 2021.07.11 |