Android

Android Manifest에 <queries> 추가하여 패키지 공개 상태 요구사항 선언하기

EEEUN 2023. 8. 13. 21:44

안드로이드 앱을 사용할 때 다른 안드로이드 앱과 상호작용해야 하는 상황이 있을 수 있다. 

하지만 안드로이드 11(API 수준 30)부터는 안드로이드 앱에서 단말에 설치된 다른 앱 목록을 가져올 수 없다. 

 

안드로이드 11 이상의 앱에서 다른 앱과 상호작용해야 한다면, Manifest 파일에 <queries> 요소를 추가하여 다른 앱을 지정할 수 있다.

 

https://developer.android.com/training/package-visibility/declaring?hl=ko

 

패키지 공개 상태 요구사항 선언  |  Android 개발자  |  Android Developers

패키지 공개 상태 요구사항 선언 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱을 만들 때는 앱이 상호작용해야 하는 기기의 다른 앱을 고려하는 것이

developer.android.com

공식 문서 참고. 예시 코드도 나와있으므로 이해하기 쉽다.

 

특정 패키지 이름 지정

상호작용하려는 앱(예 : 내 앱과 통합된 앱 또는 내가 사용 중인 서비스를 제공하는 앱)을 알고 있다면 <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" />