퍼미션은 앱의 특정 기능에 부여하는 접근 권한을 말한다. 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때 퍼미션 사용을 설정해야한다. 마찬가지로 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고 권한을 얻은 앱에서만 허용하고 싶을 때 퍼미션을 설정한다.
퍼미션은 메니페스트 파일에 설정한다. 즉, 내가 만든 앱의 컴포넌트에 대한 퍼미션을 설정하는 것이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testmodule">
<permission android:name="com.example.testmodule.WHOLE_PERMISSION"
android:label="Test Permission"
android:description="test permission"
android:protectionLevel="dangerous"/>
<application ...>
</application>
protectionLevel
- normal : 사용자에게 권한 허용을 요청하지 않아도 된다.
- dangerous : 사용자에게 권한 허용을 요청해야 한다.
- signature : 같은 키로 인증한 앱만 실행한다.
- signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행한다.
퍼미션이 필요한 기능에 접근하는 방법은 다음과 같다.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
안드로이드 시스템이 보호하는 대표적인 기능은 다음과 같다.
permission 이름 | permission 내용 |
---|---|
ACCESS_FINE_LOCATION | 위치 정보 접근 |
ACCESS_NETWORK_STATE | 네트워크 정보 접근 |
ACCESS_WIFI_STATE | 와이파이 네트워크 정보 접근 |
BATTERY_STATUS | 배터리 정보 접근 |
BLUETOOTH | 블루투스 장치에 연결 |
BLUETOOTH_ADMIN | 블루투스 장치를 검색하고 페어링 |
CAMERA | 카메라 장치에 접근 |
INTERNET | 네트워크 연결 |
READ_EXTERNAL_STORAGE | 외부 저장소에서 파일 읽기 |
WRITE_EXTERNAL_STORAGE | 외부 저장소에 파일 쓰기 |
READ_PHONE_STATE | 전화기 정보 접근 |
SEND_SMS | 문자 메시지 발신 |
RECEIVE_SMS | 문자 메시지 수신 |
RECEIE_BOOT_COMPLETED | 부팅 완료 시 실행 |
VIBRATE | 진동 울리기 |
<uses-permission>
으로 메니페스트 파일에 설정하였더라도, 요청한 permission 이 normal 등급이 아니라면 사용자의 허가를 받아야한다. 따라서 코드상에서 이 앱이 사용자에게 permission 을 얻었는지, 얻지 않았는지 확인할 필요가 있다.
아래의 함수를 이용해서 퍼미션이 허가됐는지 확인한다.
ContextCompat.checkSelfPermission(context : Context, permission : String)
fun permissionCheck(context: Context, permission : String): String {
if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) {
return "$permission : permission granted"
}
return "$permission : permission denied"
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println ( """ ${permissionCheck(this, Manifest.permission.ACCESS_NETWORK_STATE)}
${permissionCheck(this, Manifest.permission.ACCESS_COARSE_LOCATION)}
${permissionCheck(this, Manifest.permission.ACCESS_FINE_LOCATION)}""".trimIndent())
}
requestPermission() 함수를 이용한다. onRequestPermissionsResul 함수를 override 하면 permission 요청후 결과 값을 확인할 수 있다.
requestPermission(activity: Activity,
permissions: Array<String!>,
requestCode: Int) : Unit
ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.ACCESS_FINE_LOCATION"), 100)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("info", "permission granted")
} else {
Log.d("info", "permission denied")
}
}