오늘은 옆에 앉은 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에 알려야 합니다.
참조
