Fragment에서 권한 요청

ChoiUS·2022년 12월 1일
0

Android

목록 보기
4/4

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)
profile
사람을 위한 개발자

0개의 댓글