안녕하세요.
안드로이드에서 웹뷰로 지로를 띄우려고 합니다.
그런데 현재위치를 받아와서 이동하는데 웹환경에서는 잘됩니다만 안드로이드에 웹뷰로 올린상태로는 현재위치를 받아오지 못해 질문드려요.
package com.pharmacy.pharmacystock;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.net.URISyntaxException;
public class MainActivity extends AppCompatActivity {
private WebView mWebView; // 웹뷰 선언
private WebSettings mWebSettings; //웹뷰세팅
private static final int MY_PERMISSION_REQUEST_LOCATION = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 웹뷰 시작
mWebView = (WebView) findViewById(R.id.webview1);
}
private void initWebView(){
mWebView.setWebViewClient(new WebViewClient()); // 새로운 창을 띄우지 않고 내부에서 웹뷰를 실행시킨다.
mWebView.getSettings().setGeolocationEnabled(true);
// mWebView.setWebChromeClient(new WebChromeClient()); // 클릭시 새창 안뜨게
mWebSettings = mWebView.getSettings(); //세부 세팅 등록
mWebSettings.setJavaScriptEnabled(true); // 웹페이지 자바스클비트 허용 여부
mWebSettings.setSupportMultipleWindows(false); // 새창 띄우기 허용 여부
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(false); // 자바스크립트 새창 띄우기(멀티뷰) 허용 여부
mWebSettings.setLoadWithOverviewMode(true); // 메타태그 허용 여부
mWebSettings.setUseWideViewPort(true); // 화면 사이즈 맞추기 허용 여부
mWebSettings.setSupportZoom(false); // 화면 줌 허용 여부
mWebSettings.setBuiltInZoomControls(false); // 화면 확대 축소 허용 여부
mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 컨텐츠 사이즈 맞추기
mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 브라우저 캐시 허용 여부
mWebSettings.setDomStorageEnabled(true); // 로컬저장소 허용 여부
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
});
mWebView.loadUrl("https://suwon-pharmacy.tistory.com"); // 웹뷰에 표시할 웹사이트 주소, 웹뷰 시작
}
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();
}
}
}
여러 글을 참고하여 편집하였으나 웹뷰도 뜨지않게되고 흰화면만 나오게됩니다.
웹에서는 현재 좌표를 아래 코드로 받아옵니다.
if (navigator.geolocation) { // GPS를 지원하면
navigator.geolocation.getCurrentPosition(function(position) {
// alert(position.coords.latitude + ' ' + position.coords.longitude);
var moveLatLon = new kakao.maps.LatLng(position.coords.latitude, position.coords.longitude);
초보개발자입니다. 아시는 분은 꼭 답글 부탁드립니다.
현재 수정하여 화면도 뜨고 권한체크까지 되지만 여전히 웹뷰안에서 현재위치를 찾지 못합니다…
package com.pharmacy.pharmacystock;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import java.net.URISyntaxException;
public class MainActivity extends AppCompatActivity {
private WebView mWebView; // 웹뷰 선언
private WebSettings mWebSettings; //웹뷰세팅
private final int My_ACCESS_FINE_LOCATION=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int permssionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
My_ACCESS_FINE_LOCATION);
}
}
// 웹뷰 시작
mWebView = (WebView) findViewById(R.id.webview1);
mWebView.setWebViewClient(new WebViewClient()); // 새로운 창을 띄우지 않고 내부에서 웹뷰를 실행시킨다.
// mWebView.setWebChromeClient(new WebChromeClient()); // 클릭시 새창 안뜨게
mWebSettings = mWebView.getSettings(); //세부 세팅 등록
mWebSettings.setJavaScriptEnabled(true); // 웹페이지 자바스클비트 허용 여부
mWebSettings.setSupportMultipleWindows(false); // 새창 띄우기 허용 여부
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(false); // 자바스크립트 새창 띄우기(멀티뷰) 허용 여부
mWebSettings.setLoadWithOverviewMode(true); // 메타태그 허용 여부
mWebSettings.setUseWideViewPort(true); // 화면 사이즈 맞추기 허용 여부
mWebSettings.setSupportZoom(false); // 화면 줌 허용 여부
mWebSettings.setBuiltInZoomControls(false); // 화면 확대 축소 허용 여부
mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 컨텐츠 사이즈 맞추기
mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 브라우저 캐시 허용 여부
mWebSettings.setDomStorageEnabled(true); // 로컬저장소 허용 여부
mWebView.getSettings().setGeolocationEnabled(true);
mWebView.loadUrl("https://suwon-pharmacy.tistory.com"); // 웹뷰에 표시할 웹사이트 주소, 웹뷰 시작
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//뒤로가기 버튼 이벤트
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {//웹뷰에서 뒤로가기 버튼을 누르면 뒤로가짐
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case My_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this,"승인이 허가되어 있습니다.",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this,"아직 승인받지 않았습니다.", Toast.LENGTH_LONG).show();
}
return;
}
}
}
private class WebViewClientClass extends WebViewClient {//페이지 이동
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("intent://")|| url.startsWith("coupang://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
mWebView.getContext().startActivity(intent);
} else {
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id="+intent.getPackage()));
mWebView.getContext().startActivity(marketIntent);
}
return true;
}catch (Exception e) {
e.printStackTrace();
}
} else if (url != null && url.startsWith("market://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
mWebView.getContext().startActivity(intent);
}
return true;
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
view.loadUrl(url);
return false;
}
}
}
C.L
3
현위치를 잡는 부분은 카카오 API 에서 처리하는 것이 아니라 도움을 드리기가 어렵습니다.
android webview geolocation 등으로 구글링해보시면 도움이 될 듯합니다.
혹시 해결하셨나요?
저도 같은 문제를 겪고있어서요.