본문

[2017.09.25] 19. Runtime Permission 개념과 실습

개념

Runtime Permission은 구글I/O가 2015년 5월 28~29일 공개한 마시멜로우 버전(API레벨 23)부터 적용된 개념이다. 

Runtime Permission은 앱 사용 중 사용자로부터 승인 받아 사용하는 권한입니다.

마시멜로우 버전 의 Permission은 아래 그림과 같다. 

마시멜로우 이전 버전

사용자 입장에서 Play store에 저장된 앱을 설치 할 때 요구하는 권한에 모두 동의해야했다.

개발자 입장에서는 앱에 필요한 권한을 AndroidManifest.xml에 선언만하면 되었다.


마시멜로우 이후 버전

마시멜로우 이후 버전부터는 앱 실행 중 사용자에게 허락을 받아서 사용해야된다.


실습

step1. AndroidManifest.xml에 등록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.heepie.day022_permisstion">    
    <!-- ...-->    
 
    <!-- 권한 설정 -->
    <!-- 런타임 권한, 자바 코드로 설정 필요 O -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 
    <!-- 빌드타임 권한, 자바 코드로 설정 필요 X -->
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <!-- ...-->
</manifest>
cs


step2. MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 앱 버전 체크, M은 마시멜로우를 의미, M아래 버전은 fullname 사용
        // 마시멜로우 이상 버전일 경우, 권한 체크 진행
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            checkPermission();
        else {
            // 액티비티 초기화 이후 진행
        }
    }
 
    @TargetApi(Build.VERSION_CODES.M)
    private void checkPermission() {
        // 1. 권한이 있을 경우
        if (((checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) ==
                                        PackageManager.PERMISSION_GRANTED)) &&
            (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) ==
                                        PackageManager.PERMISSION_GRANTED) {
            // 액티비티 초기화 이후 진행
        // 2. 권한이 없을 경우
        } else {
            // 2-1. 요청 권한 변수 설정
            String permission[] = { Manifest.permission.READ_EXTERNAL_STORAGE,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE};
            // 2-2. 권한 요청
            // 파라미터 (요청 권한 변수, 고유 요청 번호)
            requestPermissions(permission, 999);
        }
 
    }
 
    // 3. 권한 요청에 따른 동작
    // 파라미터 (고유 요청 번호, 요청한 권한, 요청 결과)
    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                           @NonNull String[] permissions, 
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 
        switch (requestCode) {
        case 999:
            if (grantResults[0== PackageManager.PERMISSION_GRANTED
                    && grantResults[1== PackageManager.PERMISSION_GRANTED) {
 
                // 액티비티 초기화 이후 진행
            }
            break;
        }
    }
}
cs


스크린 샷

API 19인 키켓에서는 Runtime Permission이 실행되지 않고

API 23인 마시멜로우에서는 Runtime Permission이 실행되는 것을 볼 수 있다.



#안드로이드 권한 #Runtime Permission #런타임 권한

공유

댓글