Android 13 기능 및 변경사항 목록 | Android 개발자 | Android Developers
Android 13 대응은 8월 31일까지 완료해야만 한다.
8월 31일까지 Target SDK를 33으로 올리지 않은 앱은 최신 기종의 폰에서는 플레이스토어에 더이상 노출되지 않으며,
다음 업데이트도 불가하다.
그래서 나도 회사에서 부랴부랴 13 대응을 완료하였고 그 내용을 정리해보았다.
회사 프로젝트는 대부분 java 프로젝트이므로 java 기준으로 작성하였다.
주요 변경 내용
- 알림 권한 추가
- Storage 권한 변경
- PhotoPicker (참고)
- Clipboard Toast 및 민감 정보 추가
- AD_ID
setAppCacheEnabled
webView.setWebViewClient(new WebClient());
WebSettings setting = webView.getSettings();
setting.setJavaScriptEnabled(true);
//setting.setAppCachePath(appCachePath); // deprecated android 13
//setting.setAppCacheEnabled(true); // deprecated android 13 , WebSettings.LOAD_NO_CACHE 이므로 사용 의미 없음
- setAppCacheEnabled은 Android 13부터 Deprecated 됨
- 애초에 캐시를 사용하지 않으므로 의미 없음
- 주석처리 후 대응 완료.
권한 요청
1. 기본적으로 알림 권한이 차단됨. minSdk33 부터 알림을 따로 권한 설정해줘야 함
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" android:minSdkVersion="33"/>
2. READ_EXTERNAL_STORAGE의 권한이 세분화 됨
- READ_MEDIA_IMAGES / READ_MEDIA_VIDEO / READ_MEDIA_AUDIO
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" android:minSdkVersion="33"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
클립보드
- 토스트 메세지 숨기기
- 민감 정보 체크하여 숨기기
class ClipboardUtils(base: Context) : ContextWrapper(base) {
companion object {
@JvmStatic
fun copyToClipboard(context: Context, text: String, isSensitive: Boolean) {
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip: ClipData = ClipData.newPlainText("Copied Text", text)
// android 13에서 민감 콘텐츠 정보 숨기기
if (isSensitive && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
clip.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
}
clipboard.setPrimaryClip(clip)
// android 13 이전 버전인 경우에만 클립보드 복사 토스트 메세지
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2)
context.showToast("클립보드에 복사되었습니다.")
}
@JvmStatic
fun pasteClipboardContent(context: Context): String {
// Get clipboard manager object.
val clipboardService = context.getSystemService(CLIPBOARD_SERVICE)
val clipboardManager = clipboardService as ClipboardManager
// Get clip data from clipboard.
val clipData = clipboardManager.primaryClip
if (clipData != null) {
// Get item count.
val itemCount = clipData.itemCount
if (itemCount > 0) {
// Get source text.
val item = clipData.getItemAt(0)
if (item != null && !TextUtils.isEmpty(item.text)) {
return item.text.toString()
}
}
}
return ""
}
}
}
AD_ID
1. Console 앱 콘텐츠 정책 AD_ID 추가
<!-- Required only if your app targets Android 13 or higher. -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
2. AD_ID를 사용하지 않는데 Console 페이지에서 오류가 나는 경우
- Firebase를 연결한 경우 자동으로 Manifest에 AD_ID가 명시됨 (적혀있지 않아도)
- 앱콘텐츠 정책에서 ‘애널리틱스’ 사용 중으로 선언