앱을 만들 때는 앱이 상호작용해야 하는 기기의 다른 앱을 고려하는 것이 중요합니다. 앱이 Android 11(API 수준 30) 이상을 타겟팅한다면 시스템에서 일부 앱을 내 앱에 자동으로 표시하지만 어떤 앱은 기본적으로 필터링됩니다. 이 가이드에서는 필터링되는 앱을 내 앱에 표시하는 방법을 설명합니다.
앱이 Android 11 이상을 타겟팅하며 자동으로 표시되는 앱이 아닌 다른 앱과 상호작용해야 한다면 앱의 매니페스트 파일에 <queries>
요소를 추가하세요. 다음 섹션에서 설명한 대로 <queries>
요소 내에 패키지 이름, 인텐트 서명 또는 제공자 권한으로 다른 앱을 지정합니다.
특정 패키지 이름
쿼리하거나 상호작용하려는 특정 앱(예: 내 앱과 통합된 앱 또는 내가 사용 중인 서비스를 제공하는 앱)을 알고 있다면 <queries>
요소 내의 <package>
요소 집합에 패키지 이름을 포함합니다.
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
라이브러리의 호스트 앱과 통신
Android 라이브러리를 개발한다면 AAR 매니페스트 파일에 <queries>
요소를 추가하여 패키지 공개 상태 요구사항을 선언할 수 있습니다. 이 <queries>
요소는 앱이 자체 매니페스트에서 선언할 수 있는 요소와 기능이 동일합니다.
라이브러리에 바인드된 서비스 사용과 같은 호스트 앱과의 통신이 포함된 경우 호스트 앱의 패키지 이름을 지정하는 <package>
요소를 포함하세요.
<!-- 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>
요소에는 몇 가지 제한사항이 있습니다.
- 정확히
<action>
요소 하나를 포함해야 합니다. <data>
요소에서path
,pathPrefix
,pathPattern
또는port
속성을 사용할 수 없습니다. 시스템은 각 속성 값을 일반 와일드 카드 문자(*
)로 설정한 것처럼 동작합니다.<data>
요소의mimeGroup
속성을 사용할 수 없습니다.단일
<intent>
요소의<data>
요소 내에서 다음 각 속성을 최대 한 번 사용할 수 있습니다.mimeType
scheme
host
이러한 속성을 여러
<data>
요소 전체에 배포하거나 단일<data>
요소에서 사용할 수 있습니다.
<intent>
요소는 일반 와일드 카드 문자(*
)를 몇 가지 속성의 값으로 지원합니다.
<action>
요소의name
속성<data>
요소(image/*
)의mimeType
속성의 하위유형<data>
요소(*/*
)의mimeType
속성의 유형 및 하위유형<data>
요소의scheme
속성<data>
요소의host
속성
이전 목록에 달리 지정되지 않은 한 시스템에서는 텍스트와 와일드 카드 문자의 혼합(예: prefix*
)을 지원하지 않습니다.
특정 권한을 사용하는 패키지
콘텐츠 제공자를 쿼리해야 하지만 구체적인 패키지 이름을 모르는 경우 다음 스니펫과 같이 <provider>
요소에서 제공자 권한을 선언할 수 있습니다.
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
단일 <queries>
요소에 제공자 권한을 선언할 수 있습니다. <queries>
요소 내에서 <provider>
요소를 하나 이상 선언할 수 있습니다. <provider>
요소에는 단일 제공업체 권한 또는 세미콜론으로 구분된 제공업체 권한 목록이 포함될 수 있습니다.
모든 앱(권장되지 않음)
드문 경우지만, 포함하는 구성요소와 상관없이 기기에 설치된 모든 앱을 쿼리하거나 상호작용해야 할 수 있습니다. 앱이 설치된 모든 앱을 확인할 수 있도록 허용하려면 시스템에서 QUERY_ALL_PACKAGES
권한을 제공합니다.
QUERY_ALL_PACKAGES
권한이 포함되기에 적절한 사용 사례의 예는 다음과 같습니다.
- 접근성 앱
- 브라우저
- 기기 관리 앱
- 보안 앱
- 바이러스 백신 앱
하지만 대개는 자동으로 표시되는 일련의 앱과 상호작용하고 매니페스트 파일에 앱이 액세스해야 하는 다른 앱을 선언하여 앱의 사용 사례를 충족할 수 있습니다. 사용자 개인 정보 보호를 준수하기 위해 앱은 작동하는 데 필요한 패키지 공개 상태를 최소한으로 요청해야 합니다.
이 Google Play의 정책 업데이트는 QUERY_ALL_PACKAGES
권한이 필요한 앱에 관한 가이드라인을 제공합니다.