안드로이드 학습(Kotlin)

5. Android Permission (권한)

리저브콜드브루 2025. 2. 3. 13:21
728x90
반응형

Permission이 필요한 이유

  • Android는 사용자의 민감한 정보(카메라, 위치, 연락처 등)에 접근하기 전에 사용자의 명시적인 동의를 요구한다.
  • 보안: 악성 앱이 중요한 데이터에 접근하지 못하도록 보호
  • 프라이버시: 사용자가 자신의 데이터에 대한 제어권을 가질 수 있도록 보장

권한의 종류

권한 종류 설명 예시
Normal Permissions 위험성이 낮아 자동으로 허용됨 인터넷 사용, 진동 제어
Dangerous Permissions 민감한 데이터 접근 시 사용자 동의 필요 카메라, 위치, 연락처
Signature Permissions 같은 서명으로 서명된 앱끼리만 허용 시스템 API 호출
Special Permissions 시스템 설정 변경과 같은 특별한 권한 다른 앱 위에 그리기 (Overlay), 배터리 최적화 예외

Normal Permission (일반 권한)

  • 보안 위험이 거의 없는 권한
  • 설치 시 자동으로 허용되며 사용자 동의가 필요 없음

예시 (Manifest 등록만으로 허용)

<uses-permission android:name="android.permission.INTERNET" /> //인터넷 권한
<uses-permission android:name="android.permission.VIBRATE" /> //진동 제어 권한

Dangerous Permission (위험 권한)

  • 사용자의 민감한 정보에 접근하거나 기기 기능을 제어하는 권한
  • 런타임 권한 요청이 필요 (Android 6.0 이상)
권한 그룹 권한 예시
카메라 android.permission.CAMERA
위치 ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION
연락처 READ_CONTACTS, WRITE_CONTACTS
마이크 RECORD_AUDIO
전화 READ_PHONE_STATE, CALL_PHONE
저장소 READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE

Dangerous Permission 요청 과정

1단계: Android Manifest.xml에 권한 선언

<uses-permission android:name="android.permission.CAMERA" /> //카메라 권한 요청

 

2단계: 런타임 권한 요청 코드

private val CAMERA_PERMISSION_CODE = 100

fun requestCameraPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {

        // 권한이 허용되지 않았다면 요청
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.CAMERA),
            CAMERA_PERMISSION_CODE
        )
        
    } else {
        // 이미 권한이 허용된 경우
        Toast.makeText(this, "카메라 권한이 이미 허용되었습니다.", Toast.LENGTH_SHORT).show()
    }
}

 

3단계: 권한 요청 결과 처리

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

    if (requestCode == CAMERA_PERMISSION_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "카메라 권한 허용됨", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "카메라 권한 거부됨", Toast.LENGTH_SHORT).show()
        }
    }
}

Special Permission (특수 권한)

SYSTEM_ALERT_WINDOW (다른 앱 위에 표시)

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

앱이 다른 앱 위에 오버레이로 표시할 수 있는 권한

 

Manifest 선언 외에 설정에서 사용자 수동 허용 필요

if (!Settings.canDrawOverlays(this)) {
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))
    startActivityForResult(intent, 101)
}

 

WRITE_SETTINGS (시스템 설정 변경)

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

밝기 조절, 벨소리 변경 등 시스템 설정을 변경할 수 있는 권한

 

if (!Settings.System.canWrite(this)) {
    val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
    intent.data = Uri.parse("package:$packageName")
    startActivity(intent)
}

주의: 같은 그룹 내 권한은 한 번 허용하면 그룹 전체가 허용된다.

728x90
반응형