[안드로이드] 안드로이드 14 (targetSdk 34) 이상 선언 시, 점검사항
구글 플레이 정책으로는 기존 앱의 경우 24년 8월 31일까지 Android 13(Sdk 33) 이상을 타겟팅 해야한다고 명시되어있으며, 앞으로 앱을 업데이트 하게 되는 경우에는 최대 2024년 11월 1일까지 34 이상을 타겟팅 해야 한다고 명시 되어있습니다.
기존 프로젝트에서 targetSdk34 이상 선언 시 아래 사항을 점검해주시기 바랍니다.
1. MADP 사용 시
1-1. 프로젝트 내의 라이브러리 버전을 확인 후 아래 라이브러리 보다 낮은 버전인 경우 라이브러리 업데이트
- Core 라이브러리 2.1.8.37 미만의 라이브러리
* core 라이브러리를 업데이트 하는 경우 프로젝트에서 사용되고 있는 addon/plugin 라이브러리 업데이트도 진행
[라이브러리 버전 확인 방법]
(1) IDE > 프로젝트(application.xml) > 라이브러리 매니저탭
(2) 프로젝트 mcoreLibs > m_core_2.1.x.x.jar
[라이브러리 업데이트 관련 참고사항]
- 이전 코어 라이브러리가 2.1.8.11 미만의 버전인 경우 : https://developer.uracle.co.kr/faq/?pageid=3&mod=document&uid=420
- 이전 코어 라이브러리가 2.1.8.31 미만의 버전인 경우 : https://developer.uracle.co.kr/faq/?uid=2546&mod=document&pageid=1
- IDE 미설치 환경에서의 라이브러리 관리 : https://developer.uracle.co.kr/faq/?uid=2881&mod=document&pageid=1
1-2. 미디어와 관련된 권한의 변경이 있으므로 AndroidManifest.xml에 아래 항목을 추가
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
2. 사용자 사진과 동영상 권한에 대해 Google play 사용자 데이터 정책에 따라 개인정보 및 민감한 정보로 간주되어 2024년 10월 31일부터는 공유 저장소에 있는 사진/동영상 파일에 지속적으로 빈번하게 액세스 해야하는 앱은 앱을 개시할 때 핵심 사례를 입증해야하도록 구글 정책이 변경되었습니다. 이에 일회성으로 사용하거나 빈번하지 않게 사진/동영상을 액세스하는 경우 사진 선택 도구와 같은 시스템 선택 도구를 사용하도록 안내하고 있습니다.
참고문서 : https://support.google.com/googleplay/android-developer/answer/14115180?hl=ko
따라서 아래 안내를 참고하시어 비즈니스 정책에 맞는 방식으로 imagepicker를 사용하시기 바랍니다.
2-1. 이미지를 빈번하게 액세스 해야하는 앱으로 ImagePicker를 사용하는 경우
- ImageList1Activity.java 변경 (첨부파일 참고)
아래 내용 제거
if (imageMode) {
mImageList = getImage();
}
else {
mImageList = getVideo();
}
System.out.println(mImageList.size());
mImageLoader = new ImageLoader(this);
GridView gridView = (GridView) findViewById(ID_LIST);
//gridView.setNumColumns(3);
gridView.setAdapter(new MyAdapter(this));
gridView.setOnItemClickListener(this);
onCreate 하단에 아래 내용 추가
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
//아래 내용은 adapter를 지정하는 부분에 적용
if(Build.VERSION.SDK_INT >= 34) {
//매회 해당 권한 요청 후 선택된 이미지에 대하여ImageList1Activity로 출력
String[] mediaPermissions = new String[]{"android.permission.READ_MEDIA_VISUAL_USER_SELECTED","android.permission.READ_MEDIA_IMAGES","android.permission.READ_MEDIA_VIDEO"};
PermissionUtil.checkPermissions(this, mediaPermissions, 888, new IRequestPermissionsListener() {
@Override
public void permissionGranted() {
Log.e("permissionGranted_TAG","permissionGranted");
}
@Override
public void permissionDenied() {
Log.e("permissionDenied_TAG","permissionDenied");
}
});
}else{
SetImageAdapter();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if(requestCode == 888) {
SetImageAdapter();
}
}
public void SetImageAdapter(){
if (imageMode) {
mImageList = getImage();
} else {
mImageList = getVideo();
}
System.out.println(mImageList.size());
mImageLoader = new ImageLoader(this);
GridView gridView = (GridView) findViewById(ID_LIST);
//gridView.setNumColumns(3);
gridView.setAdapter(new MyAdapter(this));
gridView.setOnItemClickListener(this);
}
- 앱에서 어떤 기능을 위해 이미지 피커가 사용되는지 앱을 개시할 때 앱 컨텐츠 에서 사유를 작성
2-2. 이미지를 빈번하지 않게 사영하는 경우 시스템 선택 도구를 사용하도록 아래와 같이 수정(시스템 선택도구는 path 지정 불가)
-AndroidManifest.xml 아래 권한 제거
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
-M-API 사용시 적용( mediatype = ALL로 변경)
M.media.picker({
mode : "SINGLE",
mediaType : "ALL",
3. PUSH 사용시
Android 14의 경우 안드로이드 정책상 foreground Service를 사용하는 영역에 대해 AndroidManifest.xml에 foregroundServiceType을 필수로 명시하도록 되어있습니다.
foregroundService를 사용하는 영역이 있는 경우 해당 service 태그에 관련된 foregroundServieType을 명시해야하며 구글에서는 권한에 맞는 기능을 사용하는지, 불필요한 기능을 사용하는지 등 확인을 위해 영상을 등록하도록 안내하고 있습니다.
- UPNS 제품 및 UPNS + FCM 제품 사용 시
UPNS가 사용되는 제품의 경우 푸시로 발송되는 데이터의 보안을 위해 FCM을 통한 메시지 전송이 아닌 서버를 통한 메시지 전송을 위한 제품이며,
foregroundService를 사용하지 않으면 앱이 종료되거나 절전모드, 또는 단말기가 잠자기모드에 진입하는 경우 서버 통신이 불가능하여 푸시메시지를 원활하게 수신받지 못하는 경우가 발생할 수 있기 때문에, 주기적 서버통신 요청을 위해 foregroundService가 사용됩니다. (WorkManager의 경우 백그라운드 사용이며 네트워크 활동 브로드캐스트 수신에 제약이 존재하여 해당 기능에서는 사용하지 않습니다. )
아래 주소를 참고하시어 AndroidManifest.xml의 UPNSConnectService영역에 foregroundServiceType을 datasync로 명시해주시기 바랍니다.
foregroundservicetype을 datasync로 명시하기 때문에 "FOREGROUND_SERVICE_DATA_SYNC" 퍼미션도 추가해서 사용하시기 바랍니다.
참고 : https://wiki.uracle.co.kr/push/client/upns_5_1#h-67-androidmanifestxml-%EC%84%A4%EC%A0%95-fcm-%EC%84%A4%EC%A0%95
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<service android:name="m.client.push.library.service.UPNSConnectService"
android:exported="false"
android:foregroundServiceType="dataSync"
tools:node="replace"/>
이후, 앱을 게시하는 영역에서 네트워크 > 기타 > "데이터 보안상의 이유로 FCM이 아닌, 자체 푸시를 사용하고 있으며, 푸시 데이터의 동기화를 위해 사용" 으로 지정하실 수 있습니다.
해당 부분은 안드로이드 OS 정책 변경 등으로 대부분의 포그라운드 서비스를 사용하는 앱에 대해, 최초로 해당 정책을 적용하여 앱을 업데이트 할 시, 또는 앱 배포 시에 필수 작업으로 영상을 게시하도록 지정될 수 있습니다.
다른 어떤 항목을 체크 하더라도 동영상첨부가 필요할 것으로 보이며, 배포 할 앱에서 해당 기능을 사용하여 어떤 작업을 하는지에 대한 영상을 원하는 것이기 때문에
앱에서 푸시를 수신받는 부분에 대한 영상을 별도로 남겨 유튜브나 구글드라이브 등에 올린 후 해당 주소를 올리는 방식 등으로 업로드가 필요합니다.
- FCM 만 단독으로 사용 시 : (UPNS remove)
FCM (Public PUSH) 를 사용하는 경우 별도로 당사의 foregroundService를 사용하지 않기 때문에 필요 시 아래와 같이 적용하여 upns를 사용하지 않도록 처리하시기 바랍니다.
AndroidManifest.xml upns remove 영역 참고 : https://wiki.uracle.co.kr/push/client/fcm#androidmanifestxml-%EC%84%A4%EC%A0%95
<service android:name="m.client.push.library.service.UPNSConnectService"
android:exported="false"
tools:node="remove"/>
(참고) FCMIntentService 는 FirebaseMessagingService를 상속받고 있으며 FirebaseMessagingService 자체로는 포그라운드 서비스가 아니기 때문에 forgroundServiceType을 명시할 필요는 없습니다.