-
[Android] Webview Geolocation 사용하기LANGUAGE/ANDROID 2020. 8. 24. 19:01
안드로이드 웹뷰를 통해 지도앱이나 위치정보를 사용하는 웹페이지를 이용할 경우가 있는데
단말기의 GPS를 통해 얻은 위치정보를 전달해줘야 합니다.
별 다른 웹뷰 설정이 안되있는 상태라면 위 이미지의 좌측 상단의 현재위치 버튼 클릭시 정상 동작을 하지 않을 것입니다.
- Geolocation
웹에서는 HTML5 Geolocaion API를 사용하여 위치정보를 요청합니다.
그럼 안드로이드 웹뷰에서는 아래와 같은 코드 설정을 통해 응답처리가 가능합니다.
webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setGeolocationEnabled(true); webView.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); callback.invoke(origin, true, false); } });
invoke() 함수 파라메터 중 allow는 권한 승낙, retain은 유지를 의미합니다.
invoke()를 통해 웹뷰 내부적으로 위치정보를 가져와 전달합니다.
invoke(String origin, boolean allow, boolean retain)
https://developer.android.com/reference/android/webkit/GeolocationPermissions.Callback.html
- Location Permission
안드로이드의 위치정보를 가져오기 위해서는 위치권한이 필요합니다.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
그렇다면 위치 권한 요청은 어느 시점에 하면 좋을까요?
개인 차이가 있겠지만 저의 경우 앱 공통으로 사용하는 웹뷰 액티비티를 사용하고 있어서
onCreate() 함수에서 요청하기 보다는
위에 나온 onGeolocationPermissionsShowPrompt() 에서 권한 확인 및 요청을 하였습니다.
그렇게 되면 사용자에게 웹에서 위치정보 요청이 왔을 경우에만 권한 확인을 할 수 있습니다.
또한 onGeolocationPermissionsShowPrompt() 함수에서 넘겨주는 GeolocationPermissions.Callback 변수의 invoke() 함수를 호출 하게 되면 같은 객체로 invoke() 함수를 두번 호출 할 수 없습니다.
두번 호출 시 아래와 같은 로그를 확인 할 수 있습니다.
Response for this geolocation request has been received. Ignoring subsequent responses
정리하면 아래와 같은 코드가 됩니다
val geolocationCallback: GeolocationPermissions.Callback? = null webView.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); //필요한 시점에 invoke() 함수 호출을 하기위해 변수 저장 geolocationCallback = callback //위치권한 확인 및 요청 } });
'LANGUAGE > ANDROID' 카테고리의 다른 글
[Android] Room cannot verify the data integrity (0) 2021.05.18 [Android] java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzji@xxx (0) 2020.10.16 외부 라이브러리 추가시 AndroidManifest.xml 병합 (0) 2020.07.08 [Kotlin] object 익명 클래스, 무명 객체 [anonymous object] 에서 View 접근하기 (0) 2020.06.19 FCM Android Backgroud (feat. app launch) (0) 2019.07.26