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가 비활성화되는 경우 실행이 안될 수 있기 때문에 실행 가능한지 확인하는 것이 중요합니다.
Recommended Posts:
- Android - BuildConfig 정보 읽기 및 상수 추가
- Android 11 - Privacy 변경사항 요약
- Android11 - Storage(저장소) 정책 변경사항 정리
- Android11 - Package visibility 변경사항 소개
- Android - File-Based Encryption과 Direct Boot 이해하기
- 안드로이드 Q - Thermal API로 발열 상태 모니터링
- 안드로이드 Q - Background Activity 실행 제한 정책
- Android App Bundle로 Apk 크기를 더 작게 만들기
- 안드로이드 Q - Background Location 권한 제한 정책
- 안드로이드 Q - 새로운 저장소 정책, Scoped Storage 알아보기
- 안드로이드 Q - Settings Pannel에 대해서 알아보기
- 안드로이드 Q - Mainline, APEX에 대해서 알아보기
- 안드로이드 - JobScheduler로 백그라운드 작업 실행하는 방법