Android 11 - 시스템 기본 카메라 정책

JS · 22 Dec 2020

Android 11부터 3rd party app들은 기본적으로 시스템에 설치된 카메라를 사용하도록 변경되었습니다. 따라서 카메라를 실행시키는 앱은 Android 11에서 앱의 사용성에 문제가 없는지 확인해야 합니다.

변경 사항

안드로이드에서는 다음 Action들을 이용하여 카메라를 실행시킵니다.

  • android.media.action.VIDEO_CAPTURE
  • android.media.action.IMAGE_CAPTURE
  • android.media.action.IMAGE_CAPTURE_SECURE

즉, 아래와 같이 이 인텐트들을 이용하여 Activity를 실행시킬 때 기존에는 ChooserActivity가 실행되어 사용자가 카메라 앱을 선택할 수 있었습니다. 하지만 Android 11부터는 시스템에 설치된 앱이 실행됩니다. 만약 시스템에 2개의 앱이 있다면 ChooserActivity가 실행되어 시스템앱 중 하나를 선택할 수 있습니다.

// When taking a picture
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivity(intent)

// When recording
val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
startActivity(intent)

Non-System 카메라 앱 실행

시스템 앱이 아닌, User 영역에 설치된 카메라 앱을 실행시키려면 intent에 package를 명시해줘야 합니다.

예를 들어, 다음과 같이 Intent.setPackage("com.footej.camera")로 package 이름을 설정하고 실행시키면 Footej 카메라 앱이 실행됩니다.

val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
intent.setPackage("com.footej.camera")
startActivity(intent)

설치된 카메라 앱 찾기

R OS부터 PackageManager API로 카메라 앱을 찾기는 어렵습니다.

이전에는 아마도 이렇게 카메라 앱의 실행 가능한 Activity를 찾았을 것 같은데요. queryIntentActivities()에서 System 앱의 카메라 앱만 리턴되도록 변경되었기 때문에 이제는 사용할 수 없습니다.

val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
val results : List<ResolveInfo> =
        packageManager.queryIntentActivities(intent, 0)

for (info in results) {
    Log.d("Test", "package name: ${info.activityInfo.applicationInfo.name}"
            + ", activity name: ${info.activityInfo.name}")
}

결국 App에서 Camera 앱 리스트를 갖고 있고, 그 앱이 설치되어있는지 확인해야 할 것 같습니다.

val packageName = "com.footej.camera";
val installed : ApplicationInfo =
        packageManager.getApplicationInfo(packageName, 0)
if (installed != null) {
    // installed
}

그리고 다시 위에서 확인한 package가 ACTION_IMAGE_CAPTURE의 Activity를 갖고 있는지 다시 확인할 수 있습니다.

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.setPackage("com.footej.camera")
val results : List<ResolveInfo> =
        packageManager.queryIntentActivities(intent, 0)
if (results.size > 0) {
    // available
}

모든 확인 작업이 끝났다면, 이제 startActivity()로 실행시킬 수 있습니다. 위의 확인 작업은 귀찮지만, Activity가 비활성화되는 경우 실행이 안될 수 있기 때문에 실행 가능한지 확인하는 것이 중요합니다.

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha