본문 바로가기
안드로이드

[Android 11] ActivityNotFoundException와 패키지 가시성

by 디지털노마더 2021. 10. 15.

Firebase 버그 리포트에서 'android.content.ActivityNotFoundException' 이 확인되었다.

발생 코드를 확인해보니, 링크를 브라우저 앱으로 실행하는 곳이었다.

 

기존에는 정상적으로 서비스가 되던 부분이었는데.. 갑자기 왜 ?

 

Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://www.naver.com"));
startActivity(i);

 

구글링 하다보니 Android 11부터 '패키지 가시성'이라는 속성이 추가되었다고 한다.

 

* 패키지 가시성이란?

 사용자가 기기에 설치한 앱에 대한 가시성을 의미

 

즉, Android 11(API 레벨30) 이상부터는 기기에 설치된 필터링된 앱 목록만 확인이 가능합니다.

필터링된 목록 이외에 앱에 액세스 하려면 Android Manifest 내에 <queries> 요소를 추가하여 필요한 앱을 선언해야 합니다.

 

1. 구체적인 앱 패키지명을 알고 있을 경우

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

 

2. 앱 패키지명은 모르지만, Intetent 필터 작업을 할 경우

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
    </queries>
    ...
</manifest>

 

부가적으로 startActivity(intent)를 요청하기 전에 resolveActivity()를 이용해서 링크를 실행할 앱 목록의 유효성을 검증하는 것을 권장한다.

 

혹여나 공유할 앱이 없을 경우는 조건문에서 걸러지기 때문에, ActivityNotFoundException이 발생하지 않게 된다.

Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://www.naver.com"));
i.addCategory(Intent.CATEGORY_BROWSABLE);
if (intent.resolveActivity(getPackageManager()) != null) {
	startActivity(i);
}

 

 

# 참고링크

https://developers-kr.googleblog.com/2021/04/working-with-package-visibility.html

댓글