Android Gallery Permission

2023. 12. 17. 14:11·Android

https://chanho-study.tistory.com/48

 

Android Runtime Permission

Permission 퍼미션은 AndroidManifest.xml에 들어가는 설정입니다. 안드로이드 컴포넌트를 이용한 앱과 앱 사이의 연동이 빈번한데, 특정 앱이 을 부여했다면 그 앱을 이용하는 앱은 을 선언해야 합니다.

chanho-study.tistory.com

이전 글에서 안드로이드 RunTime Permission에 대해 알아 봤으니 이제 프로젝트에 적용해 보겠습니다.

 

가장 먼저 갤러리에 접근하기 위한 권한을 선언해 줍니다!!

AndoridManifest.xml

<!--갤러리 관련 권한 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

 

외부 저장소에 대한 읽기와 쓰기 권한을 요청하기 위한 상수 배열을 정의 해줍니다.

class Constants {
    companion object{
        val REQUEST_STORAGE_PERMISSIONS = arrayOf(
            android.Manifest.permission.READ_EXTERNAL_STORAGE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
        )

    }

}

 

권한 요청을 위한 launcher를 선언해 주었습니다. shouldShowRequestPermissionRationale(permission)로 사용자가 권한을 거부하고 "다시 묻지 않음" 체크박스를 체크했을 때 snakBar를 통해 사용자에게 왜 권한이 필요한지 보여줍니다. snackBar에는 권한이 거부된 경우 Snackbar를 통해 메시지를 표시하고, "확인" 액션을 누르면 애플리케이션의 설정 화면으로 이동합니다.

private val launcherForPermission = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ){ permissions ->
        if (permissions.all { it.value }) {
            accessGallery()
        } else {
            // 하나 이상의 권한이 거부된 경우 처리할 작업
            permissions.forEach { (permission, isGranted) ->
                when {
                    !isGranted -> {
                        // 사용자가 이전에 해당 권한을 거부하고, "다시 묻지 않음"을 선택한 경우에 false를 반환
                        if(!shouldShowRequestPermissionRationale(permission)){
                            // 사용자에게 왜 권한이 필요한지 설명하는 다이얼로그 또는 메시지를 표시
                            showPermissionSnackBar()
                        }
                    }
                    else -> {
                        // 사용자가 "다시 묻지 않음"을 선택한 경우 처리할 작업
                        showPermissionSnackBar()
                    }
                }
            }

        }

    }

private fun showPermissionSnackBar() {
        Snackbar.make(binding.root, "권한이 거부 되었습니다. 설정(앱 정보)에서 권한을 확인해 주세요.",
            Snackbar.LENGTH_INDEFINITE
            ).setAction("확인"){
                //설정 화면으로 이동
                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                val packageName = requireActivity().packageName
                Log.d("MyPackageName", packageName)
                val uri = Uri.fromParts("package", packageName, null)
                intent.data = uri
                startActivity(intent)
        }.show()
    }

 

이제 사용자가 버튼을 클릭하면 isAllPermissionGranted() 함수를 통해 상수로 정의한 권한이 모두 허용되었으면 True 반환합니다. 허용되지 않은 권한있다면 권한을 요청하고 권한이 허용됐다면 갤러리를 열고 거부했을 경우 위에서 선언해준 launcher에 필요한 권한을 요청합니다.

imgLoadButton.setOnClickListener {
    if (isAllPermissionsGranted()) accessGallery()
    else launcherForPermission.launch(REQUEST_STORAGE_PERMISSIONS)
}

private fun isAllPermissionsGranted(): Boolean = REQUEST_STORAGE_PERMISSIONS.all { permission->
    ContextCompat.checkSelfPermission(requireContext(), permission) 
   		 == PackageManager.PERMISSION_GRANTED
}

 

실행 화면

 

'Android' 카테고리의 다른 글

Android Main Thread  (2) 2023.12.23
Anroid REST API 연동기 [GET]  (3) 2023.12.22
Android Runtime Permission  (1) 2023.12.17
OkHTTP httpLoggingInterceptor  (2) 2023.12.15
Retrofit Network Time out  (0) 2023.12.15
'Android' 카테고리의 다른 글
  • Android Main Thread
  • Anroid REST API 연동기 [GET]
  • Android Runtime Permission
  • OkHTTP httpLoggingInterceptor
빨주노초잠만보
빨주노초잠만보
  • 빨주노초잠만보
    과거의 나를 통해 미래의 나를 성장시키자
    빨주노초잠만보
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • TEKHIT ANDROID SCHOOL (4)
      • Android Architecture (7)
      • Android (40)
      • PROJECT (5)
      • KOTLIN (10)
        • 코루틴의 정석 (3)
      • BACK END (12)
      • CS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    orbit
    android clean architecture
    Throttle
    kotlin array
    kotlin abstract class
    Repository Pattern
    value class
    sealed class vs enum class
    interface vs abstract
    kotlin interface vs abstract
    saeled class enum class 차이
    Room
    kotlin interface
    Livedata
    android Room
    kotlin interface abstract 차이
    ThrottleFirst
    DI
    Clean Architecture
    DataSource
    리사이클러뷰 풀
    sealed class
    repository
    코틀린 코루틴의 정석
    의존성 주입
    kotlin 타입 소거
    STATEFLOW
    MVI
    callbackflow
    flow
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
빨주노초잠만보
Android Gallery Permission
상단으로

티스토리툴바