안드로이드 개발을 처음하다보니 IOS 와 많이 달라 햇갈리네요. ㅜㅜ 

주의할 점은 퍼미션 종류별 API 수준에 따라 퍼미션 설정하는 방법이 다르다는 거에 놀랍네요. 왜 이렇게 파편화 해놨을까? ㅡ.,ㅡ;

 

예들들어 READ_EXTERNAL_STORAGE 의 경우 SDK 33(Android 13) 이상에서는 3개로 세분화 되어 따로 처리해줘야 된다능..

READ_EXTERNAL_STORAGE가 아래 3가지로 쪼개졌.... 

Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES,

 

퍼미션 설정시 4개를 전부 등록해 주고.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>

 

 

아래처럼 버전을 구분해서 퍼미션 요청을 해야됩니다.

POST_NOTIFICATIONS 의 경우도 마찬가지... 퍼미션 사용시 항상 버전별로 다 확인해서 설정해야됨. 이하버전은 퍼미션 승인없이

자동승인된다고 하네요.. 신기하군..

String[] permission;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
    // SDK 30 미만 (Android 11 미만)
    permission = new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.CALL_PHONE
    };
    ActivityCompat.requestPermissions(this, permission, ALL_PERMISSION);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {

    // SDK 33 이상 (Android 13 이상)
    permission = new String[]{
            Manifest.permission.READ_MEDIA_AUDIO,
            Manifest.permission.READ_MEDIA_VIDEO,
            Manifest.permission.READ_MEDIA_IMAGES,
            Manifest.permission.CALL_PHONE,
            Manifest.permission.POST_NOTIFICATIONS
    };
    ActivityCompat.requestPermissions(this, permission, ALL_PERMISSION);

} else {

 

퍼미션 설정 후 퍼미션 승인 여부 확인은 아래 코드 참조하세요.

public final int ALL_PERMISSION = 1000;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode != -1) {
        switch (requestCode) {
            case ALL_PERMISSION:

                if(grantResults.length > 0) {
                    for(int i = 0 ; i < grantResults.length ; i++) {
                        switch (permissions[i]) {
                            case Manifest.permission.READ_MEDIA_IMAGES:
                                if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    // 승인됨
                                } else {
                                    // 미승인
                                }
                            case Manifest.permission.READ_MEDIA_VIDEO:
                                if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    // 승인됨
                                } else {
                                    // 미승인
                                }
                            case Manifest.permission.READ_MEDIA_AUDIO:
                                if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    // 승인됨
                                } else {
                                    // 미승인
                                }
                            case Manifest.permission.CALL_PHONE:
                                if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    // 승인됨
                                } else {
                                    // 미승인
                                }
                            case Manifest.permission.POST_NOTIFICATIONS:
                                if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    // 승인됨
                                } else {
                                    // 미승인
                                }
                        }
                    }
                }
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

 

[플랫폼별 API 수준 정보]         

                 플랫폼버전                          API 수준                                    버전 코드                                           Notes

Android 15 API 34 → DP1 VANILLA_ICE_CREAM 플랫폼 하이라이트
Android 14 34 UPSIDE_DOWN_CAKE 플랫폼 하이라이트
Android 13 33 TIRAMISU 플랫폼 하이라이트
Android 12 32 S_V2 플랫폼 하이라이트
31 S 플랫폼 하이라이트
Android 11 30 R 플랫폼 하이라이트
Android 10 29 Q 플랫폼 하이라이트
Android 9 28 P 플랫폼 하이라이트
Android 8.1 27 O_MR1 플랫폼 하이라이트
Android 8.0 26 O 플랫폼 하이라이트
Android 7.1.1
Android 7.1
25 N_MR1 플랫폼 하이라이트
Android 7.0 24 N 플랫폼 하이라이트
Android 6.0 23 M 플랫폼 하이라이트
Android 5.1 22 LOLLIPOP_MR1 플랫폼 하이라이트
Android 5.0 21 LOLLIPOP
Android 4.4W 20 KITKAT_WATCH 웨어러블 기기 전용 KitKat
Android 4.4 19 KITKAT 플랫폼 하이라이트
Android 4.3 18 JELLY_BEAN_MR2 플랫폼 하이라이트
Android 4.2, 4.2.2 17 JELLY_BEAN_MR1 플랫폼 하이라이트
Android 4.1, 4.1.1 16 JELLY_BEAN 플랫폼 하이라이트
Android 4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1 플랫폼 하이라이트
Android 4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
Android 3.2 13 HONEYCOMB_MR2  
Android 3.1.x 12 HONEYCOMB_MR1 플랫폼 하이라이트
Android 3.0.x 11 HONEYCOMB 플랫폼 하이라이트
Android 2.3.4
Android 2.3.3
10 GINGERBREAD_MR1 플랫폼 하이라이트
Android 2.3.2
Android 2.3.1
Android 2.3
9 GINGERBREAD
Android 2.2.x 8 FROYO 플랫폼 하이라이트
Android 2.1.x 7 ECLAIR_MR1 플랫폼 하이라이트
Android 2.0.1 6 ECLAIR_0_1
Android 2.0 5 ECLAIR
Android 1.6 4 DONUT 플랫폼 하이라이트
Android 1.5 3 CUPCAKE 플랫폼 하이라이트
Android 1.1 2 BASE_1_1  
Android 1.0 1 BASE

 

+ Recent posts