TIl. 안드로이드 앱 권한과 사용 카메라하기

Devback·2021년 1월 9일
0

Kotlin

목록 보기
4/8

안드로이드 앱이 동작하면서 시스템의 특정 부분을 사용하려면 안드로이드보부터 권한을 위임받아야 한다. 예를 들어 전화번호 같은 경우 개인정보가 유출될 가능성이 있기 때문에 권한을 확인 받아야한다.

권한의 보호 수준 ✅

권한은 일반 권한(Normal Permission), 위험 권한(Dangerous Permission), 서명 권한(Signature Permission) 세 가지의 보호 수준으로 나뉜다.

일반 권한(Normal Permission) ✅

일반 권한은 AndroidManifest.xml 설정 파일에 명세하면 설치 시 사용자에게 권한 승인을 묻는 팝업창을 보여준다. 인터넷 사용, 알람 설정 등이 일반 권한에 포함된다.

블루투스를 예를 들면 설정 파일에 명세하는 방법은 <uses-permission android:name="android.permission.BLUETOOTH" /> 태그를 manifest태그 안에 삽입하면 된다.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android_prac">
    
`     <uses-permission android:name="android.permission.BLUETOOTH" />
	..

</manifest>

위험 권한(Dangerous Permission) ✅

위험 권한(Dangerous Permission)은 앱이 사용자의 개인정보나 관련된 데이터나 기능을 액세스하거나 다른 앱 및 기기의 작동에 영향을 줄 우려가 있는 권한입니다.

서명 권한(Signature Permission) ✅

서명 권한(Signature Permission)은 권한을 사용하려는 앱이 권한을 정의하는 앱과 동일한 인증서로 서명된 경우 시스템은 권한을 자동으로 부여한다. 쉽게 말하자면, 구글에서 만든 앱은 권한이 자동으로 부여되는 것과 같다고 생각하면 된다.

권한 그룹🎳

각가의 권한은 그룹 단위로 구성된다. 파일에 대해 읽기/쓰기 권한이 있으면 2개의 권한은 하나의 그룹에 속한다. 권한에 대한 요청은 그룹 단위로 처리되며 동일한 권한 그룹 내에서 다른 권한이 이미 부여된 경우 시스템은 즉시 권한을 부여합니다.

카메라 사용 해보기 📸

소스 코드에서 위험 권한 처리하기
1단계: 권한에 대한 사용자 승인 확인(이전에 승인하였는지)
2단계: 사용자에게 승인 요청
3단계: 사용자 승인 후 처리

manifest.xml에 명세하기

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android_prac">
    
`     <uses-permission android:name="android.permission.CAMERA" />
	..

</manifest>

package com.example.android_prac

import android.Manifest.permission.CAMERA
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            checkPermission()
        }
    }

// 1. 이전에 사용자가 허용하였는지 확인 
    fun checkPermission() {
        val cameraPermission = ContextCompat.checkSelfPermission(
                this@MainActivity,
                android.Manifest.permission.CAMERA
        )

        if(cameraPermission != PackageManager.PERMISSION_GRANTED) {
            // 권한이 없는 경우 permission 권한을 띄우는 알람창을 띄운다. 
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 1000)
        } else {
            // 권한이 있는 경우
            Toast.makeText(this, "카메라를 실행합니다", Toast.LENGTH_LONG).show()
        }
    }
	
    
    //권한을 두는 팝업창에 사용자가 Deny Eh또는 수락을 클릭하면 액태비티의 onRequestPermissionResult()가 호출된다. 이 메서드 안에서 승인 후 처리하면 된다. 
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if( requestCode == 1000) {
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Toast 창 띄우기
                Toast.makeText(this, "카메라를 실행합니다", Toast.LENGTH_LONG).show()
            } else {
                // 액티비티 끝내기 
                finish()
            }
        }
    }
}

정리

  1. 사용자가 권한을 승인 했는지 확인한다. -> checkSelfPermission 메서드 사용
  2. 승인을 하지 않았다면 승인 요청을 한다. -> requestPermissions 메서드 사용
  3. 사용자가 승인이나 거부를 하면 -> onRequestPermissionResult 메서드를 사용한다.
profile
나랑 같이 개발할 사람🖐

0개의 댓글