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
반응형
'안드로이드 학습(Kotlin)' 카테고리의 다른 글
7. 레이아웃 (LinearLayout, RelativeLayout, ConstraintLayout) 구조와 사용법 (0) | 2025.02.03 |
---|---|
6. Android Theme (테마) (0) | 2025.02.03 |
4. Android Activity LifeCycle과 Activity 전환 (1) | 2025.02.03 |
3. Android 4대 컴포넌트 (Activity, Service, BroadcastReceiver, ContentProvider)의 이해 (0) | 2025.01.24 |
2. Gradle 빌드 시스템의 이해 (0) | 2025.01.24 |