코틀린 프로젝트로 안드로이드에서 ARcore sceneform 사용해보기 1

오늘은 코틀린 안드로이드 프로젝트에서 ar을 쉽게 구현할 수 있는 라이브러리인 arcore sceneform을 쉽게 사용해보려 합니다.

자바8 이슈

android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

Sceneform 라이브러리가 자바8으로 작성되어 있어서 minSdkVersion가 26 이하면 위와 같이 app.gradle에 작성해주어야 합니다.

의존성

dependencies {
    implementation 'com.google.ar:core:1.5.0'
    implementation 'com.google.ar.sceneform:core:1.5.0'
    implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.5.0'
}

ux 의존을 없앤 버전을 사용하려면 core만 작성해주시면 되지만, 일반적으로는 sceneform-ux 를 위와 같이 app.gradle에 작성해주어야 합니다.

manifest

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

manifest 파일에 카메라 관련 설정을 추가해줍니다.

안드로이드 6.0 이상에서는 카메라 권한을 추가로 요청해야 합니다.

해당 작업은 이전에 작성한 권한에 대한 포스팅을 참고하시면 됩니다.

<application>
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

ar에 대한 설정을 application에 넣어주면 됩니다.

required로 되어 있으면, play store에 앱이 등록될 때 이 앱은 arcore가 있어야 한다고 자동으로 인지할 수 있습니다.

만약 ARcore가 꼭 필요없는 앱이라면 optional로 변경해주면 됩니다.

런타임 확인

val availability = ArCoreApk.getInstance().checkAvailability(this)
        if (availability.isTransient) {
            Handler().postDelayed({
                maybeEnableArButton()
            }, 200)
        }
camera_fab.isEnabled = availability.isSupported

만약 ARcore가 꼭 필요없는 앱이라서 optional로 변경해주었다면, 앱에서 ar이 동작할 때 arcore가 동작하는지 확인해주어야 합니다.

ARcore 앱 감지

gradle에서 Sceneform을 의존성으로 걸었다면 앱에서 arfragment를 생성할 때에 자동으로 앱이 있는지 확인해줍니다.

private var installRequested: Boolean = false
private var session: Session? = null

override fun onResume() {
    super.onResume()
    if (session == null) {
        var exception: Exception? = null
        var message: String? = null
        try {
            when (ArCoreApk.getInstance()?.requestInstall(this, !installRequested)) {
                ArCoreApk.InstallStatus.INSTALL_REQUESTED -> {
                    installRequested = true
                        return
                }
                ArCoreApk.InstallStatus.INSTALLED -> {
                }
            }
            session = Session(this)
        } catch (e: UnavailableArcoreNotInstalledException) {
                message = "INSTALL_REQUESTED ARCore"
                exception = e
        }
        if (message != null) {
                Log.e(TAG, "Exception", exception)
                return
        }
    }
    session!!.resume()
}

세션을 시작할 때에 예외처리를 통해 arcore를 설치했는지 판단할 수 있습니다.

openGL 버전 확인

arcore는 기본적으로 스마트폰이 openGL 3.0 이상을 지원해야 가능합니다.

val openGlVer = (this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager)
        .deviceConfigurationInfo
        .glEsVersion
if (openGlVer.toDouble() < MIN_OPENGL_VERSION) {
    longToast("requires OpenGL ES 3.0 later!")
} else {
    // ARfragment 실행
}

시스템의 openGL 버전을 가져와서 소수점이 필요하므로 더블형으로 변환해주며 MIN_OPENGL_VERSION를 비교해봅니다.

private val MIN_OPENGL_VERSION = 3.0

MIN_OPENGL_VERSION는 미리 지정한 상수입니다.

비교했을 때에 지원되는 버전 이상이면 ARfragment를 나타나게 해주는 엑티비티로 이동하게 됩니다.

다음 편에서는 sceneform에서 ArFragment를 생성하고, 모델링을 나타나게 해보겠습니다.

Written on October 13, 2018