민프

[Android][ARcore - 2] 초기설정, GooglePlay ARCore 지원 여부 확인 본문

[Android]

[Android][ARcore - 2] 초기설정, GooglePlay ARCore 지원 여부 확인

민프야 2021. 7. 24. 18:30

저번 포스트에서는 ARcore 예제를 해보았는데

https://minf.tistory.com/26

 

[Android][ARcore - 1] ARcore 예제를 해보자!!

ARcore을 해보려고 하는 이유는 이번 프로젝트에서 라이브 스트리밍을 해보았는데 라이브 스트리밍 + ARcore 이렇게 구현해보려고 한다. (밑 사진 참고) 저렇게 하기전에! 먼저 ARcore 예제를 해보자!!

minf.tistory.com

이번 포스트에서는 ARCore의 초기설정, 각 기기마다 ARCore를 지원하는지 확인 여부를 알아보는 코드를 알아보아야겠다.

https://developers.google.com/ar/develop/java/enable-arcore#ar-required_1

 

1. ARcore기기 확인

https://developers.google.com/ar/devices

 

ARCore 지원 장치  |  Google Developers

장치가 지원된다는 것은 무엇을 의미합니까? 간단히 말해서 인증 프로세스를 통과했음을 의미합니다. 사용자가 AR 애플리케이션에 대해 좋은 경험을하기를 원하기 때문에 인증이 중요합니다.

developers.google.com

여기에 들어가서 지원하는 장치의 스펙 및 버전을 확인하면 될 것 같다

 

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

Comments