안드로이드/이론

안드로이드스튜디오 권한설정하기

원원 2019. 1. 20. 20:08

안녕하세요 오늘은 안드로이드스튜디오 권한설정하는법을 알아보겠습니다





어플을 사용하다보면 이런창이 뜰때가 있는데 이게 권한을 허용해도되는지 묻는 사진입니다.

마쉬멜로우 이전 버전에서는, 이러한 권한을 얻을 때 따로 이런창이 뜨지 않고 개발자가 코드상에 권한허가를 넣어주면 되었습니다

그러나 마쉬멜로우 이후부터는 권한을 사용자에게 허락을 맞아야 합니다.

사용자에게 권한을 허락맞지않고, 권한이 필요한 기능을 사용하려하면 에러가 뜹니다


예를들어 사용자의 저장소에서 사진을 불러와야하는 코드를 짜고 수행을 해보면 에러가뜹니다


2019-01-20 19:47:19.819 15645-15645/com.example.kkk.myapplication W/ImageView: Unable to open content: content://media/external/images/media/4579

    java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/4579 from pid=15645, uid=10480 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

READ_EXTERNAL_STORAGE 권한이 필요하다고 나옵니다


이때, 이걸 해결 할 수 있는 방법은 2가지있습니다

1. 권한창띄우기




2. 사용자가 권한허용


2번 방법은 사용자가 거의 안하는 행동이므로 1번 권한창을 띄워줘야 합니다



*참고자료 권한리스트

https://developer.android.com/guide/topics/security/permissions#normal-dangerous

권한 그룹권한
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE



1. 코드

1)manifests에 사용할 권한을 등록합니다

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>



2)메인코드

*앱이 실행되면 권한창을 띄워주고, 권한을 허가하지않으면 앱이 종료되는 코드


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
public class MainActivity extends AppCompatActivity {

    String[] permission_list = {
            Manifest.permission.WRITE_CONTACTS
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        checkPermission();
    }
 
    
    public void checkPermission(){
        //현재 안드로이드 버전이 6.0미만이면 메서드를 종료한다.
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            return;
 
        for(String permission : permission_list){
            //권한 허용 여부를 확인한다.
            int chk = checkCallingOrSelfPermission(permission);
 
            if(chk == PackageManager.PERMISSION_DENIED){
                //권한 허용을여부를 확인하는 창을 띄운다
                requestPermissions(permission_list,0);
            }
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==0)
        {
            for(int i=0; i<grantResults.length; i++)
            {
                //허용됬다면
                if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                }
                else {
                    Toast.makeText(getApplicationContext(),"앱권한설정하세요",Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
    }
 
}



3~5번째 줄에 필요한 권한을 스트링배열에 넣으면됩니다

43~44번째 줄은 권한을 하나라도 허용하지않으면, 앱이 종료되는 부분입니다