일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- android notification
- 앱에 광고 수익
- kotlin
- 국제우편물
- 정국라면
- android 터치시 뒤집히는 뷰
- android 뒤집히는 카드뷰
- 애드몹 설정
- Android AdMob
- RecyclerView in Admob
- android 광고달기
- 불그리레시피
- 안드로이드 광고
- android 앱업데이트 없이 변경하기
- android 수익
- 우편물재난문자
- android remoteconfig
- 정국라면레시피
- 앱에 광고달기
- 테러우편물
- 안드로이드 뒤집히는 뷰
- 안드로이드
- 앱 광고 설정
- 안드로이드 리스트뷰와 광고
- android kotlin
- FlipView
- 라면레시피추천
- Android
- android 영단어 기능 만들기
- firebase RemoteConfig
- Today
- Total
TAE
[Android/Kotlin] 갤러리 접근 권한(Premission) 설정하기 - 커스텀 갤러리(1) 본문
안드로이드 앱을 개발하다 보면 특정 권한을 얻어야지만 사용이 가능한 기능들이 있습니다.
Android6.0 (API 수준 23) 마쉬멜로우 이전 버전은 메니페스트에 권한을 넣어주면 사용이 가능했지만, 마쉬멜로우 이상 부터 접근 권한을 받아야 사용이 가능하도록 바뀌었습니다.
안드로이드 권한에 관하여 알아보겠습니다.
실행 동작
1. 권한 종류
모든 기능에 권한이 필요한 것이 아니라 민감한 정보(앨범, 저장소, 연락처, 전화걸기, 위치정보 등등)등 에 대한 기능에 권한이 필요합니다.
아래 디벨롭 사이트에 자세한 확인이 가능합니다.
https://developer.android.com/guide/topics/permissions/overview?hl=ko#normal-dangerous
https://developer.android.com/reference/android/Manifest.permission#public-constructors
2. 코틀린 코드
권한추가(AndroidManifest.xml)
Manifests에 저장소 읽기 권한을 추가합니다. (앨범 불러오기 이므로 앨범은 저장소 읽기 권한을 사용합니다.)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.videoselectthumbnail">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.VideoSelectThumbnail">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
권한 얻기(MainActivity.kt)
먼저 위에서 보았던 영상처럼 "앨범 불러오기" 버튼을 만든 후 클릭 리스너를 정의 해 줍니다.
binding.goAlbumTV.setOnClickListener {
when {
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
//스토리지 읽기 권한이 허용이면 커스텀 앨범 띄워주기
//권한 있을 경우 : PERMISSION_GRANTED
//권한 없을 경우 : PERMISSION_DENIED
}
shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
//권한을 명시적으로 거부한 경우 : ture
//다시 묻지 않음을 선택한 경우 : false
//다이얼로그를 띄워 권한 팝업을 해야하는 이유 및 권한팝업을 허용하여야 접근 가능하다는 사실을 알려줌
showPermissionAlertDialog()
}
else -> {
//권한 요청
requestPermissions(
arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
PERMISSION_CODE
)
}
}
}
checkSelfPermission
첫번째로 checkSelfPermission을 실행한다. 인자로 해당 권한을 넣고 확인하는데 주석 해놓은 것 처럼
권한 있을 경우 : PERMISSION_GRANTED
권한 없을 경우 : PERMISSION_DENIED
을 반환한다.
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
//스토리지 읽기 권한이 허용이면 커스텀 앨범 띄워주기
//권한 있을 경우 : PERMISSION_GRANTED
//권한 없을 경우 : PERMISSION_DENIED
}
PackageManager.PERMISSION_GRANTED 이면 접근 권한이 있는 것으로 원하는 동작을 실행해 주면 됩니다.(다음 동작은 다음 장에서..)
shouldShowRequestPermissionRationale
두번째 when문인 shouldShowRequestPermissionRationale 는 권한이 거부 된 경우 이다.
주석에 표시한것 처럼 반환값은
//권한을 명시적으로 거부한 경우 : ture
//다시 묻지 않음을 선택한 경우 : false
처음으로 거부 할 경우 ture를 반환하여 다이얼로그를 통하여 한번 더 권한을 승인 할 것이냐고 묻는 팝업을 띄워준다.
shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
//다이얼로그를 띄워 권한팝업을 허용하여야 접근 가능하다는 사실을 알려줌
showPermissionAlertDialog()
}
*다이얼 로그 팝업(showPermissionAlertDialog)
private fun showPermissionAlertDialog() {
AlertDialog.Builder(this)
.setTitle("권한 승인이 필요합니다.")
.setMessage("사진을 선택 하시려면 권한이 필요합니다.")
.setPositiveButton("허용하기") { _, _ ->
requestPermissions(
arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
PERMISSION_CODE
)
}
.setNegativeButton("취소하기") { _, _ -> }
.create()
.show()
}
requestPermissions(권한 요청)
else -> {
//권한 요청
requestPermissions(
arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
PERMISSION_CODE
)
}
권한을 요청하는 함수.
처음 when문 분기문으로 허용상태가 아니고, 다시묻지 않음인 경우가 아닐 경우 권한 요청을 한다.
requestPermissions은 인자로 array를 받는데, 여러개의 권한을 요청 할 경우가 있기 때문입니다.
두번째 인자는 requestCode(PERMISSION_CODE)인데 이 code값은 아래에 설명할 onRequestPermissionsResult 에서 사용됩니다.
onRequestPermissionsResult
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
PERMISSION_CODE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//권한 허용클릭
//TODO()앨범으로 이동시키기!
} else if (shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
//권한 처음으로 거절 했을 경우
//한번더 권한 요청
showPermissionAlertDialog()
} else {
//권한 두번째로 거절 한 경우 (다시 묻지 않음)
//설정 -> 권한으로 이동하는 다이얼로그
goSettingActivityAlertDialog()
}
}
}
}
권한팝업이 뜨고 권한을 허용을 하였는지 거부를 하였는지를 체크하여 해당 이벤트에 맞는 동작을 실행하는 함수이다.
override하여 사용하시면 됩니다.
* cantrol + 엔터 후 검색
첫번째 if문은 위에서 설명했듯이 권한이 허용 되었을 경우 PackageManager.PERMISSION_GRANTED 으로 넘어옴으로 권한 승인 후 동작을 구현 해 주면 됩니다.
두번째 if문
권한이 처음으로 거절되었을 경우는 반환값으로 true가 반환되고, 두번째는 flase가 반환되는데,
첫번째로 거절되었을 경우 위와 같이 권한 승인 팝업을 띄워준다.
else 구문
다시 묻지 않음인 경우가 되었을 경우에는 더이상 requestPermissions을 실행 하지 않으므로, 설정으로 가서 사용자가 직접 권한을 허용하게 하여야 한다.
그렇게 하기 위해 앱 설정으로 가겠냐는 다이얼로그 팝업을 추가 해 주었습니다
* goSettingActivityAlertDialog
private fun goSettingActivityAlertDialog() {
AlertDialog.Builder(this)
.setTitle("권한 승인이 필요합니다.")
.setMessage("앨범에 접근 하기 위한 권한이 필요합니다.\n권한 -> 저장공간 -> 허용")
.setPositiveButton("허용하러 가기") { _, _ ->
val goSettingPermission = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
goSettingPermission.data = Uri.parse("package:$packageName")
startActivity(goSettingPermission)
}
.setNegativeButton("취소") { _, _ -> }
.create()
.show()
}
이상 안드로이드 코틀린 권한 얻는 법 포스팅 이였습니다.
궁금하신점이나 잘못된게 있다면 댓글 달아주시면 감사하겠습니다!
'android > 코드' 카테고리의 다른 글
[android/Kotlin] 푸시 메시지 구현 - firebase 프로젝트 만들기 (0) | 2023.03.21 |
---|---|
[Android/Kotlin] 비디오에서 썸네일 이미지 지정하기 - 비디오 썸네일 지정(2) (0) | 2023.03.20 |
[Android/Kotlin] registerForActivityResult사용하여 앨범에서 사진 선택하기- 비디오 썸네일 지정(1) (0) | 2023.03.20 |
[Android/Kotlin] 커스텀 앨범 만들기 - 커스텀 갤러리(2) (0) | 2023.03.17 |
[kotlin] isEmpty() , toInt() 적용안됨 (0) | 2021.08.27 |