(Android) Android 11에서 연락처 선택기가 작동하지 않음

오늘은 옆에 앉은 iOS 개발자와 앱 연동에 대해 이야기하다가 연락처를 불러오는 기능을 제대로 작동하지 않는다는 것알아야해 (눈물…)

val intent = Intent(Intent.ACTION_PICK).apply {
     data = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
}
if (intent.resolveActivity(packageManager) != null) {
     startActivity(intent)
}

위의 코드는 기기에 설치된 연락처 앱을 실행합니다. 안드로이드 10 이하에서는 정상적으로 동작하는지 확인할 수 있지만, 안드로이드 11에서는 아무 일도 일어나지 않는 것을 확인할 수 있습니다.

실제 업체 코드를 가져오지 못해서 문제가 되는 코드를 생성한 점 참고 부탁드립니다 🙂

패키지 가시성

패키지 가시성은 Android 11 이상에서 지원되며 사용자에게 민감한 정보이므로 기기에 설치된 앱에서 정보를 쉽게 가져올 수 없도록 만들어졌습니다.

패키지 가시성 정책

https://support.google.com/googleplay/android-developer/answer/10446026

연락처, 카메라, 앨범 기능이 필요할 때 시간과 복잡성과 같은 현실적인 문제가 발생하여 외부 앱을 통해 제공할 수 있도록 개발합니다. 그러나 명시적 또는 암시적 의도로 요청한 경우 기기에 설치된 앱 중 해당 기능을 처리하기에 적합한 앱이 없습니다. ActivityNotFoundException앱이 다운되는 문제가 있었습니다. TT

그러나 Android 11의 패키지 가시성 도입으로 적절한 앱이 실제로 존재하더라도 미리 지정하지 않으면 찾을 수 없는 경우가 있습니다.

* try-catch 구문 사용 ActivityNotFoundException직접 또는 코드에서와 같이 용해도장치에 제대로 처리할 수 있는 앱이 있는지 미리 확인할 수도 있습니다!

해결

<manifest package=...>

    <queries>
        <intent>
            <action android:name="android.intent.action.PICK" />
            <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
        </intent>
    </queries>
    ...

</manifest>

안드로이드 매니페스트 파일 외부 앱 패키지 또는 의도 작업은 요소에서 선언되어야 합니다.

따라서 앱 외부에서 연락처를 사용하려면 연락처의 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" />

이 경우 Google은 Android 11부터 시작합니다. QUERY_ALL_PACKAGES 권한이 추가되었습니다. 그러나 반드시 권한을 선언할 필요는 없으며 Google Developers Console에서 권한 양식을 작성하고 해당 기능 없이는 앱을 사용할 수 없게 만드는 핵심 기능임을 Google에 알려야 합니다.

참조