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
'안드로이드' 카테고리의 다른 글
RecyclerView IndexOutOfException : invalid item position (0) | 2021.10.29 |
---|---|
getPackageManager().getLaunchIntentForPackage return null (0) | 2021.10.22 |
안드로이드 단위테스트란? (0) | 2021.08.09 |
To use Coroutine features, you must add `ktx` artifact from Room as a dependency (0) | 2021.06.25 |
Glide를 활용한 WebView 이미지 로드 속도 높이기 (0) | 2021.06.15 |
댓글