본문 바로가기

프로그래밍/안드로이드

[안드로이드] 권한(Permission)

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.



권한(Permission)


안드로이드는 마시멜로우 버전부터 권한을 부여하는 방식이 바뀌었습니다. 마시멜로우 버전 이전에는 앱을 설치할 때 권한을 사용한다고 사용자에게 말하기 때문에 많은 사용자들이 아무 생각없이 설치하는 경우가 많았으며 이에 따라 설치된 앱의 주요기능을 마음대로 사용할 수 있었습니다. 이는 보안적으로도 많은 문제가 있습니다. 이러한 이유때문에 마시멜로우 버전 이상 부터는 앱을 실행시에 권한을 부여하도록 변경이 되었습니다.


아래 표는 Permission체크를 하고 허가를 받아야하는 Permission Group을 나타 냅니다. 



예제를 통해서 알아보겠습니다.  먼저 AndroidManifest 파일에 camera를사용 한다는 permission을 주도록 하겠습니다.



빨간색 부분이 카메라를 사용한다는 퍼미션 입니다. 



permission을 준 다음 아래와 같이 카메라를 불러오는 화면을 만듭니다.

 


그리고 다음과 같이 자바 코드에서 카메라를 불러오는 코드를 입력합니다.

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
package com.example.administrator.permission;
 
import android.content.Intent;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends AppCompatActivity {
    Button camera;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        camera = (Button)findViewById(R.id.camera);
 
        camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 
                startActivityForResult(intent,1);
            }
        });
    }
}
 
cs


코드를 입력했으니 실행을 해보겠습니다. 실행 후 camera 버튼을 클릭하면 아래와 같은 에러가 발생합니다.


java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE cmp=com.android.camera/.Camera } from ProcessRecord{e6f1692 15871:com.example.administrator.permission/u0a77} (pid=15871, uid=10077) with revoked permission android.permission.CAMERA


이와 같은 에러는 앱을 사용할 권한이 없다는 뜻입니다. 위에서 설명한 것처럼 마시멜로우 버전이상부터는 위와 같이 권한을 부여 받지 못하면 에러가 발생합니다. 그럼 우리는 사용자로 부터 카메라를 사용할 수 있게 권한을 받아야 합니다. 아래와 같이 코드를 수정해 보겠습니다.


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
56
package com.example.administrator.permission;
 
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
    Button camera;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        camera = (Button)findViewById(R.id.camera);
 
        camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
                if(permissionCheck== PackageManager.PERMISSION_DENIED){
                    // 권한 없음
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},0);
                    //Toast.makeText(getApplicationContext(),"권한없음",Toast.LENGTH_SHORT).show();
                }else{
                    //권한 있음
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent,1);
                }
 
 
            }
        });
 
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==0){
            if(grantResults[0]==0){
                Toast.makeText(this,"카메라 권한이 승인됨",Toast.LENGTH_SHORT).show();
            }else{
                //권한 거절된 경우
                Toast.makeText(this,"카메라 권한이 거절 되었습니다.카메라를 이용하려면 권한을 승낙하여야 합니다.",Toast.LENGTH_SHORT).show();
            }
        }
    }
}
 
cs


int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA); 


위의 코드를 통하여 카메라 권한이 있는지 없는지 확인을 합니다. permissionCheck변수를 통해 권한이 있을 경우와 권한이 없을 경우를 나눕니다. 권한이 없을 경우는 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},0); 코드를 이용하여 권한을 받아 옵니다. 위 코드는 다음과 같은 화면을 나타냅니다. 





여기서 '거부'나 '허용' 둘 중 어느 것을 선택하더라도 onRequestPermissionsResult 함수를 타게 됩니다. Intent의 startActivityResult 와 같은 개념입니다. onRequestPermissionsResult는 상황에 맞게 코딩 하시면 됩니다. 


이상으로 안드로이드 권한(Permission)에 대해서 알아 보았습니다.