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가 비활성화되는 경우 실행이 안될 수 있기 때문에 실행 가능한지 확인하는 것이 중요합니다.
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력