문제 상황
Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present
android:exported 란?
이 속성은 어플리케이션에서 Activity, Service 등에 접근할 수 있으며 다른 애플리케이션의 구성요소로 Activity를 시작할 수 있는지 설정합니다. 할 수 있으면 "true", 할 수 없으면 "false"입니다. "false"인 경우, 해당 액티비티는 같은 애플리케이션의 구성요소 또는 사용자 ID가 같은 애플리케이션으로만 시작할 수 있습니다.
인텐트 필터를 사용하는 경우 이 요소를 "false"로 설정하면 안 됩니다. 이렇게 설정하고 앱이 액티비티를 호출하려 하면 시스템이 ActivityNotFoundException을 발생시킵니다. 대신 이에 대한 인텐트 필터를 설정하지 않아 다른 앱이 이 액티비티를 호출하지 못하게 방지해야 합니다. 인텐트 필터가 없는 경우, 이 요소의 기본값은 "false"입니다. 이 요소를 "true"로 설정하면 이 액티비티는 액티비티의 정확한 클래스 이름을 아는 모든 앱에서 액세스할 수 있지만, 시스템이 암시적 인텐트를 일치시키려 할 때는 확인되지 않습니다.
이 특성 외에도 다른 애플리케이션에 액티비티 노출을 제한하는 방법이 있습니다. 액티비티를 호출할 수 있는 외부 엔터티를 제한하는 권한을 사용할 수도 있습니다
문제 해결
Android 12에서는 AndroidManifest.xml 파일에 Activiry에 android:exported="true"로 설정을 해 줘야합니다. 아래 예시를 참고하세요
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/MainTheme"
<intent-filter>
...
</intent-filter>
</activity>
Unity의 경우에는?
Unity에서 Android TargetSDK를 31이상으로 개발할 시에 android:exported="true"를 명시적으로 지정해주기 어려운 점이 있습니다. 이 문제는 유니티 프로젝트에서 커스텀 메인 매니페스트를 만들어서 사용해야 합니다.
PlayerSetting Menu -> Publishing Setting -> Custom Main Manifest.xml
만들어진 Manifest.xml 파일에 위와 같이 명시적으로 android:exported="true"를 설정해 주면 됩니다.
'Android > Component' 카테고리의 다른 글
Application Foreground/Backgroud 상태 확인하기 (0) | 2022.06.13 |
---|---|
[Android/Unity] Failed to install the following Android SDK packages as some licences have not been accepted. (0) | 2022.05.07 |
[Android/Unity] 터미널 환경에서 빌드하기 (Ubuntu) (2) | 2022.05.05 |
[Android] Service #1 - 개요 (0) | 2022.04.21 |
[Android] DI, 그리고 Hilt (작성중) (0) | 2022.04.14 |