퍼미션 체크
퍼미션 요청
퍼미션 요청 수락/거부를 나타내는 콜백함수(상용화시 거부 대처 코드 필요)
프로젝트 코드에서 해당 권한(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 처리방법
Coroutine Flow(StateFlow) Library
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")
}
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
)