728x90
Android Studio 4.2.2
Android SDK 28
Kotlin 1.5.21
권한
안드로이드 앱의 권한은 일반 권한과 위험 권한으로 나눠진다. 모든 권한 목록은 안드로이드 공식문서에서 확인할 수 있다.
일반 권한
manifest에 uses-permission 속성으로 추가하면 바로 권한이 부여되어 사용할 수 있다. 인터넷, 포그라운드 서비스 등이 해당된다.
위험 권한
사용자의 개인정보 접근 또는 개인정보를 만들 수 있는 작업에 관한 에서 특정 작업을 수행하려고 할 때 필요한 권한이다. 민감한 권한이기 때문에, manifest에 추가하여도 반드시 사용자에게 권한을 요청하여야 사용할 수 있다. 카메라, 외부 저장소 읽기 등이 해당된다. 만일 권한을 요청하지 않은 상태로 권한을 사용하고자 한다면, 권한이 없다는 에러 메시지가 뜨게 된다.
권한 설정
앱에서 사용할 모든 권한은 manifest에 명시해주어야 한다. 예시는 다음과 같다.
<manifest>
<uses-permission android:name="android.permission.INTERNET" /> <!-- 인터넷 사용 권한 설정 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 읽기 권한 설정 -->
<uses-permission android:name="android.permission.CAMERA" /> <!-- 카메라 권한 설정 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- 디바이스 재부팅 완료 신호 받기 설정 -->
...
</manifest>
권한 요청
위험 권한일 경우에 해당한다. 해당 권한이 승인되었는지 확인 후, 승인되지 않았다면 권한을 요청하는 순서로 진행된다.
코드
아래는 권한 승인여부 확인 메소드(checkXXXPermission())와 권한 요청 메소드(requesetXXXPermission())가 있는 Permission 클래스이다.
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class Permission {
val cameraCode = 401
val readCode = 402
private val cameraAndReadCode = 403
private val readAndWriteCode = 404
/* 권한 확인 */
fun checkCameraPermission(context: Context): Boolean {
val cameraPermission =
ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
return cameraPermission == PackageManager.PERMISSION_GRANTED
}
fun checkReadPermission(context: Context): Boolean {
val readPermission =
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_EXTERNAL_STORAGE
)
return readPermission == PackageManager.PERMISSION_GRANTED
}
fun checkWritePermission(context: Context): Boolean {
val writePermission =
ContextCompat.checkSelfPermission(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
return writePermission == PackageManager.PERMISSION_GRANTED
}
fun checkCamaraAndReadPermission(context: Context): Boolean =
checkReadPermission(context) && checkCameraPermission(context)
fun checkReadAndWritePermission(context: Context): Boolean =
checkReadPermission(context) && checkWritePermission(context)
/* 권한 요청 */
fun requestCameraPermission(activity: Activity) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.CAMERA),
cameraCode
)
}
fun requestReadPermission(activity: Activity) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
readCode
)
}
fun requestCameraAndReadPermission(activity: Activity) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE),
cameraAndReadCode
)
}
fun requestReadAndWritePermission(activity: Activity) {
ActivityCompat.requestPermissions(
activity,
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
readAndWriteCode
)
}
}
가장 많이 사용하는 카메라 권한과 외부 저장소 읽기 및 쓰기 권한에 대한 메소드를 구현했다. 위 코드를 응용하여 다른 위험 권한 확인 및 요청 메소드를 만들어 사용하면 된다.
예시
아래는 카메라 촬영 버튼을 누른 뒤 먼저 권한 있는지 확인 후, 없다면 요청하는 코드이다.
private val permission = Permission()
fun takePhoto() {
if (!permission.checkCameraPermission(this)) { // 카메라 권한 없을 경우
permission.requestCameraPermission(this)
return
}
/* 이미지 촬영 관련 작업 */
}
728x90
'Android' 카테고리의 다른 글
[Android] 레트로핏(Retrofit2) 사용법 (0) | 2021.11.21 |
---|---|
[Android] 직접 만든 안드로이드 프로젝트 템플릿 (0) | 2021.11.18 |
[Android] 액티비티 화면전환 애니메이션 (0) | 2021.11.12 |
[Android] 툴바(앱바) 사용하기 (0) | 2021.11.09 |
[Android] 알림 띄우기 (Notification) (0) | 2021.11.06 |