오늘 우연히 옆자리에 같이 있는 iOS 개발자분과 앱 인터렉션에 대해서 이야기를 나누는 도중 연락처를 불러오는 기능이 올바르게 동작하고 있지 않는다는 것을 알게 되었어요. (눈물...)
val intent = Intent(Intent.ACTION_PICK).apply {
data = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
위 코드는 기기 내에 설치된 연락처 앱을 실행시키는 코드입니다. Android 10 이하에서는 정상 동작하는 것을 확인할 수 있지만 Android 11 버전에서는 아무일도 일어나지 않는 것을 확인할 수 있습니다.
실제 회사 코드를 가져올 수 없어서 문제가 발생한 코드를 만들어서 가져왔다는 점 참고 부탁드립니다 :)
패키지 가시성
패키지 가시성은 Android 11 버전 이상부터 지원되며 기기 내에 설치되어 있는 앱의 정보들도 사용자의 민감한 정보라고 판단해 쉽게 가져올 수 없도록 하기 위해 만들어졌습니다.
패키지 가시성 정책
https://support.google.com/googleplay/android-developer/answer/10446026
연락처, 카메라, 앨범의 기능이 필요할 때 시간, 복잡성 등의 현실적인 문제에 부딪쳐 외부 앱을 통해 해당 기능을 제공해주도록 개발을 합니다. 그런데 명시적 또는 암시적 인텐트로 요청을 했을 때 기기 내에 설치된 앱 중에 해당 기능을 처리해 줄 적절한 앱이 존재하지 않는 경우에 ActivityNotFoundException이 발생하여 앱이 죽게 되는 문제가 있었습니다. ㅜㅜ
그런데 Android 11 패키지 가시성이 도입이 되면서 실제로는 적절한 앱이 존재한다고 해도 미리 명시하지 않으면 찾을 수 없을 수도 있습니다 ㅜㅜ
* try-catch 구문으로 ActivityNotFoundException을 직접 처리하거나 코드에서처럼 resolveActivity를 통해 기기 내에 적절히 처리해줄 수 있는 앱이 있는지 미리 확인할 수도 있습니다!
해결 방법
<manifest package=...>
<queries>
<intent>
<action android:name="android.intent.action.PICK" />
<data android:mimeType="vnd.android.cursor.dir/phone_v2" />
</intent>
</queries>
...
</manifest>
Android Manifest 파일의 <queries> 요소에 외부 앱의 패키지 혹은 Intent Action 등을 선언해야 합니다.
따라서 연락처 외부 앱을 사용하기 위해 Pick과 연락처의 mimeType인 vnd.android.cursor.dir/phone_v2을 선언해주어야 합니다.
mimeType은 text/plain, image/* 만 뿐만 아니라 다양한 mimeType을 확인하고 싶다면 이 사이트를 방문해주세요
▼
https://developer.android.com/about/versions/12/reference/common-intents-31
QUERY_ALL_PACKAGES
만일 우리 앱이 100개가 넘는 외부 앱을 사용해야 하는 경우, 또는 이전처럼 기기 내 설치된 앱의 정보가 기능으로서 필요한 경우는 어떻게 할까요?
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
구글은 이런 경우를 위해 Android 11부터 QUERY_ALL_PACKAGES 퍼미션이 추가되었습니다. 하지만 해당 권한을 선언한다고 무조건 되지 않고 구글 개발자 콘솔에서 해당 권한에 대한 양식을 작성해야 하며, 해당 기능이 없으면 앱을 못쓸 정도로 핵심 기능이라는 것을 구글에게 설명해야 한다고 합니다 ㅜㅜ
자세한 내용은 Play Console 도움말을 참고해주세요.
참고
'Android > Error' 카테고리의 다른 글
[Android] Snackbar에서 발생하는 ScrollView can host only one direct child (0) | 2023.03.02 |
---|---|
[Android] Kotlin runBlockingTest 오류 (0) | 2021.05.27 |
[Android] Dagger2 적용 후 guava Compile Error (3) | 2020.12.04 |
[Android] trying to draw too large Bitmap 해결하기 - Bitmap Resize (0) | 2020.02.07 |