Activity에서 위치 권한을 사용할 일이 생겨서 onRequestPermissionsResult
를 사용하고 있었는데 Fragment에서 사용하려고 하니 곧 depreacted 된다고 해서 다른 방법을 찾았다.
@MainThread
@NonNull
@Override
public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
@NonNull final ActivityResultContract<I, O> contract,
@NonNull final ActivityResultCallback<O> callback) {
return prepareCallInternal(contract, new Function<Void, ActivityResultRegistry>() {
@Override
public ActivityResultRegistry apply(Void input) {
if (mHost instanceof ActivityResultRegistryOwner) {
return ((ActivityResultRegistryOwner) mHost).getActivityResultRegistry();
}
return requireActivity().getActivityResultRegistry();
}
}, callback);
}
Fragment가 ActivityResultCaller의registerForActivityResult
를 override하고 있고 실행된 Activity의 결과를 받을 때 사용한다.
권한을 요청할 때는
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
Log.d(TAG, "$it")
}
형식으로 사용하고 콜백 부분에 원하는 코드를 작성하면 된다.
콜백에는 Boolean 형식으로 값이 넘어온다.
class RequestPermission : ActivityResultContract<String, Boolean>()
권한을 여러개 요청할 때는
ActivityResultContracts.RequestMultiplePermissions()
를 사용하면 되고 Map<String, Boolean>
형태로 콜백에서 사용 가능하다.
val registerForActivityResult = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) {
Toast.makeText(requireContext(), "성공", Toast.LENGTH_SHORT).show()
isPermitted = true
} else{
Toast.makeText(requireContext(), "실패", Toast.LENGTH_SHORT).show()
isPermitted = false
}
}
registerForActivityResult.launch(Manifest.permission.ACCESS_COARSE_LOCATION)