[TIL]Android Runtime Permission

mandoofu·2024년 9월 20일

안드로이드

목록 보기
9/20
post-thumbnail

Runtime Permission

  • 퍼미션 체크

    • ContextCompat.checkSelfPermission(Context, String premissionName)
  • 퍼미션 요청

    • ContextCompat.requestPermissions(Activity, String[], int)
  • 퍼미션 요청 수락/거부를 나타내는 콜백함수(상용화시 거부 대처 코드 필요)

    • ContextCompat.OnRequestPermissionsResultCallback
  • 프로젝트 코드에서 해당 권한(permission 이 필요한 function(method), constructor, class등)이 실행 될 때마다 권한을 사용할 수 있는지 확인 해야 하고, 권한을 사용할 수 없는 경우에는 사용자로부터 권한을 허가 받는 기능을 반복적으로 추가

  • ex) 이미지 사용 권한

<!-- API level 32 이하 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- API level 33 이상은 둘 다 선언 -->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
  • Runtime Permission Annotation 처리방법

    • @RuntimePermissions X Activity or Fragment 에 선언
    • @NeedsPermission X 하나 이상의 권한이 필요한 함수에 선언
    • @OnShowRationale O 권한이 필요한 이유에 대한 설명
    • @OnPermissionDenied O 권한을 거부했을 경우 처리할 함수
    • @OnNeverAskAgain O 사용자가 권한에 대해 ‘다시 묻지 않음’을 선택할 시
  • Coroutine Flow(StateFlow) Library

    • Flow 기반 퍼미션 처리 및 Jetpack Compose 도 지원
  • dependencies Setting

dependencies {
val flowPermissionVersion="1.2.0"
val lifecycleVersion="2.7.0"
/**
* StateFlow 기반 퍼미션 라이브러리
*/
implementation("dev.shreyaspatil.permission-flow:permission-flow-android:$flowPermissionVersion")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion")
/**
* Jetpack Compose 기반
*/
implementation("dev.shreyaspatil.permission-flow:permission-flow-compose:$flowPermissionVersion")
}
  • Main Setting
const val TAG = "TAG_PERMISSION_STATE"
class MainActivity : AppCompatActivity() {
	private lateinit var binding: ActivityMainBinding
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	binding = ActivityMainBinding.inflate(layoutInflater).also {
		setContentView(it.root)
	}
	binding.permissionCheckBtn.setOnClickListener {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
			permissionLauncher.launch(*permissionArray)
			multiplePermissions()
		} else {
			permissionLauncher.launch(READ_EXTERNAL_STORAGE)
			singlePermission()
		}
	}
}
private val permissionFlow = PermissionFlow.getInstance()
private val permissionLauncher = registerForPermissionFlowRequestsResult()
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
private val permissionArray = arrayOf(
	READ_MEDIA_VIDEO, READ_MEDIA_IMAGES
)

0개의 댓글