언어별(프로그램별) 유용한 정보/안드로이드

안드로이드 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();
        }
    }
}



출처: https://soulduse.tistory.com/59 

반응형