돌아오신것을 환영합니다
이번 영상에서는 사용자의 위치를 표시할 버튼이 있는
사용자 인터페이스를 설정하겠습니다
그걸 위해서 지난 영상에서는 location util(위치 util)을 만들었습니다
이제 우리의 기본 Activity(액티비티)로 가보겠습니다
우선 새로운 Composable(컴포저블)을 생성하겠습니다
여기에 놓으면 됩니다
이전 환영용 컴포저블은 치우겠습니다
그리고 이곳에 컴포저블을 추가합니다
당연히 따로 다른 파일에 만들어도 되지만
저는 그냥 여기에다가 쓰겠습니다
이것을 LocationDisplay(위치표시) 라고 하겠습니다
이것에 필요한것은 location util 입니다
그러니 locationUtils 그 다음 context 입니다
Context의 타입 context
이 컴포저블에는 컨텍스트를 import 해와야 합니다
이 컴포저블에는 여러개의 것들을 쌓아놓고 싶기 때문에 column이 있어야 합니다
그리고 이 column에 modifier(수정자)를 추가하겠습니다
modifier = modifier.fillMaxSize를 사용하겠습니다
그리고 요소들이 수평으로 정렬 되었으면 합니다
그러니까 Alignment.CenterHorizontally를 사용합니다
그리고
그리고 verticalArrangement (수직배열)도 추가하여
이렇게 ArrangeCenter(가운데로 정렬)을 설정합니다
그리고 여기에 텍스트를 추가합니다 “위치를 확인할 수 없습니다“
초반입니다
그리고 이것을 당연히 바꿔야 합니다
그리고 버튼이 있습니다
이렇게
항상 그랬듯이 이 버튼은 onClick이 필요합니다
그리고 컨텐츠도 필요합니다 저는 텍스트를 넣어서
“위치 찾기” 라고 하겠습니다
그러니 버튼에 “위치 찾기”라고 되어있겠습니다
그런 셈입니다
이제 이 버튼을 클릭하면 어떤일이 일어나야 할까요?
우리가 확인할것은 if.locationutils.haslocationpermission (위치유틸이 위치권한이 있는가)
그리고 아시다 싶이 컨텍스트를 패스합니다
그런다음에
기본적으로 여기와 여기에
우리는
이미 권한이 있다면 위치를 업데이트 하고 싶습니다
그러니 여기에 ‘만약 권한이 승인됐다면 위치를 업데이트할것’ 이라고 씁니다
그런 상황이라면 그렇게 합시다
그렇지 않다면 }else{ ‘위치 권한을 요청할것’ 이라고 합니다
이런것들을 어플리케이션 안에서 하고싶습니다
이제 권한은 어떻게 요청할까요?
우리가 해야할것은
권한 런처를 표시해야 합니다
그것을 어떻게 하냐면
우리 내부에 어떤것을 설정해야 하는데
크게 이상하지 않게 Location display의 내부에서
할 수 있습니다
ㅤ
Location display 컴포저블 안에 있는 이 column 위에 requestPermissionLauncher(권한 런처를 요청)하겠습니다
좋습니다
이것은 rememberLauncherForActivityResult 이 될 것입니다
이것은 결과를 위해 액티비티를 시작하라는 요청을 등록하는 것입니다
이렇게 하면 보이지 않는 곳에서 자동으로 관리 요청 코드 및
변환과 관련된 레코드가 레지스트리에 생성됩니다
이것은 기본적으로 우리가 이렇게 말하는것입니다 “이 팝업을 표시하시오“
“그것이 우리가 launch(런치)하고 싶은 액티비티가 될 것입니다”
“그리고 이 팝업 내부에 내용이 return(반환)되면 그 결과를 알려주시오”
그러니까 return의 결과값으로 나온것을 알려달라는 것 입니다
그것이 이 rememberLauncherForActivityResult가 하는 일입니다
그러니까 우리는 contract(계약)와 onResult에 무슨일이 있어야 하는지 패스해야 합니다
여기서 제가 패스할 contract는 우선 조금 더 보기 쉽게
새로운 줄에 쓰겠습니다 ActivityResultContracts 입니다
여기 우리가 쓸 수 있는 네임스페이스가 있으니 사용하시면 됩니다
그리고 RequestMultiplePermissions를 사용합니다
이것이 기본적으로 이 권한 런처 또는 이 런처와 맺은 contract(계약) 입니다
그래서 contract이라는 것을 패스 해야 하는것 입니다
contract은 인텐트와 변환을 지정하는것 입니다
그러니까 인텐트는 액티비티를 시작하는 것이고
그것이 우리가 여기서 하고싶은 것 입니다
우리는 result(결과)에 대한 액티비티를 시작하고 싶습니다
그래서 이름이 for Result Activity입니다 보통의 경우 별도의
액티비티는 보통 화면이지만
그냥 팝업창도 될 수 있습니다
여기 보시다싶이 우리의 MainActivity도 액티비티 이죠
그러니까
전체 화면 입니다
그러니까 우리는 이 화면 안에서 다른 화면으로 이동하라고 하고 있습니다
지금의 경우 이 팝업창이고 그런 다음 나에게 권한에 대한 결과를 제공하라고
하는것 입니다
이제 onResult에는 무슨 일이 있어야 할까요
우선 이 onResult 안에서 몇가지
코드를 실행하고 싶습니다
여기 이 map〈String,Boolean〉 유닛이 있습니다
onResult에 map〈String, Boolean〉이 있으니
무언가 있는것입니다
제가 가져야 하는것은 perimission(권한)입니다
왜냐하면 이 contract가 리턴하는것이 permissions이기 때문입니다
좋습니다
우리가 요청하는 permissions를 줄것이고
그것을 가지고 무언가를 할 수 있습니다
이 if 문장 안에서 permissions를 쓸 수 있습니다
그러니까 permission..s
이 위에도 permission이 아니라 permissions가 맞습니다
권한이 하나가 아니니
복수형입니다
그리고 permission 이것은 키-값 쌍 같은것 입니다
이것이 map 이죠
onResult에 올려서 봤을때 여기에 String(문자열)과 Bolean(불리언)에 대한 맵을 얻을것이라고 나와있습니다
따라서 불리언을 확인하려는 문자열을 패스해야 합니다
쉽게 말해서 해당 permission string에 대해 알고 싶다는 의미입니다
기본적으로 permission은 해당 권한을 값처럼 액세스 하기 위한것일 뿐이기 때문에 그 권한의
이름을 알아야 합니다
이것은 그냥 string(문자열)이고 불리언을 반환할 것 입니다
그것이 이 map이 저장하고 있는것 입니다
특정 권한에 대한 불리언을 저장하되 그것이 문자열 유형으로 되어있는 것 입니다
이 같은 경우 권한의 이름은 이 문자열입니다
Manifest.permssion.
그리고 ACCESS
ㅤ
Coarse를 사용합니다
그냥 이쪽에서 가져오겠습니다
Access coarse
Location
ACCESS_COARSE_LOCATION
이게 왜 안될까요
제가 manifast가 없어서 그렇습니다
이 imports에 있는지 확인하겠습니다
Imports에 없는것 같습니다
Manifest를 추가하겠습니다
이제 manifest가 있습니다
이제 이것이 TRUE로 나오는지
비교해야 합니다
그러니 체크를 합니다
TRUE 인지
그리고 이 안에서 필요한것을 하시면 됩니다
여기서 저는 한가지 권한만 확인하는것이 아니고
여러개의 권한을 체크할 것입니다
저에게 fine location(상세위치)도 있는지 확인하고 싶습니다
여기에 똑같이 == 사인을 쓰고
ACCESS_FINE_LOCATION이 있는지 봅니다
이 두가지의 위치 권한이 있다면 “위치에 대한 권한이 있습니다” 라고 할 수 있습니다
좋아요
그렇지 않은 경우에는 권한을 요청해야 겠습니다
영상이 너무 길어지고 있기 때문에 이쯤에서 끊는게 좋겠습니다
하지만 기초작업은 했습니다
여기에 rememberLauncherForActivityResult가 있고
Contract와 onResult에 어떻게 할지도 설정했습니다
이제 더 재밌어지는 부분입니다 권한을 받을 후에 실제로 어떤 일을 해야하는지에 대한것과
권한이 없는 경우 어떻게 해야하는지에 대한 것 입니다 그것들은
다음 영상에서 보도록 하겠습니다
So see you there.