언어별(프로그램별) 유용한 정보/안드로이드
안드로이드 WebView에서 GPS를 사용하는 방법
쉐르빌
2022. 4. 13. 09:37
반응형

MainActivity.java
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.dave.webviewgps.MainActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
manifests
<uses-permission android:name="android.permission.INTERNET"/>
다음으로 WebView에 바로 Naver map 을 바로 띄워보자 ( m.map.naver.com )
webView = (WebView) findViewById(R.id.webview);
webView.loadUrl(URL_NAVER_MAP);
목표는 다음과 같다.
1. 현재 앱 내에서 웹뷰를 띄울것.
2. 웹뷰 내에서 GPS 기능을 사용할 것.
1번에 대한 해결책은 이렇게 하면된다.
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true); // 자바스크립트 사용을 허용한다.
webView.setWebViewClient(new WebViewClient()); // 새로운 창을 띄우지 않고 내부에서 웹뷰를 실행시킨다.
webView.loadUrl(URL_NAVER_MAP);
웹뷰에서 무엇인가 GPS를 사용하기 위해 작업을 해줘야 한다는 것인데 해당 기능을 사용하기 위해서는
아래와 같이 내용을 추가해주면 된다.
첫번째 manifests에 아래 권한 추가
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
두번째 웹뷰에 gps location 권한을 사용하도록 추가
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
});
위와 같이 다 해주면 정상적으로 GPS기능을 웹뷰내에서 사용가능하게 된다.
전체소스
package com.dave.webviewgps;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private static final String URL_NAVER_MAP = "http://m.map.naver.com/";
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true); // 자바스크립트 사용을 허용한다.
webView.setWebViewClient(new WebViewClient()); // 새로운 창을 띄우지 않고 내부에서 웹뷰를 실행시킨다.
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
});
webView.loadUrl(URL_NAVER_MAP);
}
}
마시멜로우 버전 이상 권한문제 추가 + 정리된 전체소스
package com.dave.webviewgps;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private static final String URL_DAUM_MAP = "http://m.map.daum.net/";
private static final String URL_NAVER_MAP = "http://m.map.naver.com/";
private static final String TAG = MainActivityTest.class.getSimpleName();
private static final int MY_PERMISSION_REQUEST_LOCATION = 0;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
}
private void initWebView(){
webView.getSettings().setJavaScriptEnabled(true); // 자바스크립트 사용을 허용한다.
webView.setWebViewClient(new WebViewClient()); // 새로운 창을 띄우지 않고 내부에서 웹뷰를 실행시킨다.
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
});
webView.loadUrl(URL_NAVER_MAP);
}
private void permissionCheck(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
//Manifest.permission.ACCESS_FINE_LOCATION 접근 승낙 상태 일때
initWebView();
} else{
//Manifest.permission.ACCESS_FINE_LOCATION 접근 거절 상태 일때
//사용자에게 접근권한 설정을 요구하는 다이얼로그를 띄운다.
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSION_REQUEST_LOCATION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == MY_PERMISSION_REQUEST_LOCATION){
initWebView();
}
}
}
반응형