본문 바로가기
Android/Concepts

Permission 획득하기

by JuHy_ 2020. 4. 4.

일반 권한과 위험 권한

기본적으로 특정 권한을 획득하기 위해서는 Manifest에 요청할 권한을 추가하기만 하면 된다.

예전에는 이런 권한들을 앱 설치 수락 과정에서 모두 획득이 가능했는데,

사용자들로부터 위험한 권한들을 너무 쉽게 획득한다고 판단되어 Marshmallow(API 23) 버전 이후로 분리되었다.

 

일반 권한들은 기존처럼 앱 설치 시에 보여주어 수락 시에 획득이 가능하게 되고,

위험 권한들은 앱 설치 시 뿐만 아니라 앱 실행 후에 한번 더 동의를 얻어야 획득이 가능하다.

 

따라서 위에 표시된 위험 권한들은 앱 실행 후 동의를 얻어야 사용이 가능하다.

 

위험 권한 획득 방법

SMS 수신 권한 획득 과정을 구현해보자.

 

package com.juhy.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] permissions = {Manifest.permission.RECEIVE_SMS};

        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
        if(permissionCheck == PackageManager.PERMISSION_GRANTED){
            Toast.makeText(this, "SMS 수신 권한 주어져 있음", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "SMS 수신 권한 없음", Toast.LENGTH_SHORT).show();
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)){
                Toast.makeText(this, "SMS 권한 설명 필요함", Toast.LENGTH_SHORT).show();
            } else {
                ActivityCompat.requestPermissions(this, permissions, 1);
            }
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch(requestCode){
            case 1:
                if(grantResults.length > 0){
                    if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(this, "SMS 수신 권한 동의함", Toast.LENGTH_SHORT).show();
                    } else if(grantResults[0] == PackageManager.PERMISSION_DENIED) {
                        Toast.makeText(this, "SMS 수신 권한 거부함", Toast.LENGTH_SHORT).show();
                    }
                } else{
                    Toast.makeText(this, "SMS 수신 권한 획득 실패", Toast.LENGTH_SHORT).show();
                }

        }
    }
}

권한 획득 과정은 기기의 현재 상태와 사용자의 응답에 따라 조건문으로 나뉘게 된다.

이 과정을 경우에 따라 나누어 보면 다음과 같다.

 

1. 권한 확인

1-1. 권한이 있을 경우

1-2. 권한이 없을 경우

1-2-1. 권한 설명이 필요한 경우 (이전에 한번 거절되었을 경우)

1-2-2. 권한 획득 요청

 

2. 사용자 응답 확인

2-1. 사용자가 동의했을 경우

2-2. 사용자가 거부했을 경우

2-3. 기타 오류로 획득에 실패한 경우

 

이 조건문들을 활용하여 상황에 따라 적절한 위치에 원하는 기능을 넣으면 된다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android

'Android > Concepts' 카테고리의 다른 글

ActionBar에 Menu 추가하기  (0) 2020.04.13
Fragment 사용법  (0) 2020.04.09
Broadcast Receiver를 이용한 SMS 수신  (3) 2020.04.04
Service의 기본적인 사용법  (0) 2020.04.03
Activity Lifecycle(수명주기)란?  (0) 2020.04.03