Android Manifest에 <queries> 추가하여 패키지 공개 상태 요구사항 선언하기
안드로이드 앱을 사용할 때 다른 안드로이드 앱과 상호작용해야 하는 상황이 있을 수 있다.
하지만 안드로이드 11(API 수준 30)부터는 안드로이드 앱에서 단말에 설치된 다른 앱 목록을 가져올 수 없다.
안드로이드 11 이상의 앱에서 다른 앱과 상호작용해야 한다면, Manifest 파일에 <queries> 요소를 추가하여 다른 앱을 지정할 수 있다.
https://developer.android.com/training/package-visibility/declaring?hl=ko
공식 문서 참고. 예시 코드도 나와있으므로 이해하기 쉽다.
특정 패키지 이름 지정
상호작용하려는 앱(예 : 내 앱과 통합된 앱 또는 내가 사용 중인 서비스를 제공하는 앱)을 알고 있다면 <queries> 요소 내의 <package> 요소 집합에 패키지 이름을 포함한다.
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest> |
라이브러리의 호스트 앱과 통신
안드로이드 라이브러리를 개발한다면 AAR Manifest 파일에 <queries> 요소를 추가하여 패키지 공개 상태 요구사항을 선언할 수 있다.
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME /> |
이 선언을 포함하면 호스트 앱이 설치되어 있는지 확인하고 bindService()를 호출하는 등의 방식으로 호스트 앱과 상호작용할 수 있다.
인텐트 필터 서명으로 지정
상호작용하고자 하는 앱의 구체적인 패키지 이름을 모를 수 있다. 이럴 때는 <queries> 요소에 인텐트 필터 서명을 나열하면 된다. 그러면 <intent-filter> 요소와 일치하는 요소가 있는 앱을 찾을 수 있다.
다음 코드 예에는 앱에서 JPEG 이미지 공유를 지원하는 단말에 설치된 다른 앱을 볼 수 있게 해주는 <intent> 요소가 나와있다.
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest> |
<intent> 요소에는 몇 가지 제한사항이 있다.
자세한 제한사항 내용은 https://developer.android.com/training/package-visibility/declaring?hl=ko 공식 문서 참고.
특정 권한을 사용하는 패키지 지정
콘텐츠 제공자를 쿼리해야하지만 구체적인 패키지 이름을 모르는 경우 다음 스니펫과 같이 <provider> 요소에서 제공자 권한을 선언할 수 있다.
콘텐츠 제공자에 대한 설명 :
https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ko#ContentURIs 공식 문서 참고
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest> |
모든 앱 지정(권장되지 않음)
안드로이드에서 권장하지 않으나, 기기에 설치된 모든 앱을 확인해야 할 수 있다.
접근성 앱, 브라우저, 기기 관리 앱, 보안 앱, 바이러스 백신 앱이 이에 해당될 수 있다.
기기에 설치된 모든 앱을 확인할 수 있도록 허용하려면 QUERY_ALL_PACKAGES 권한을 부여한다.
uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> |