안드로이드 앱이 동작하면서 시스템의 특정 부분을 사용하려면 안드로이드보부터 권한을 위임받아야 한다. 예를 들어 전화번호 같은 경우 개인정보가 유출될 가능성이 있기 때문에 권한을 확인 받아야한다.
권한은 일반 권한(Normal Permission), 위험 권한(Dangerous Permission), 서명 권한(Signature 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)은 앱이 사용자의 개인정보나 관련된 데이터나 기능을 액세스하거나 다른 앱 및 기기의 작동에 영향을 줄 우려가 있는 권한입니다.
서명 권한(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()
}
}
}
}
checkSelfPermission
메서드 사용 requestPermissions
메서드 사용 onRequestPermissionResult
메서드를 사용한다.