Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Location is accessed in Chrome, doesn't work in WebView

I have a WebView that opens a URL that requires access to the user's location. It can determine the location when using Google Chrome outside the app, but in the app, it says I am not allowing the application to use location. Currently I have added

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

to my Manifest, and in my Class, I have:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webViewActivity);
    WebView webView = (WebView) findViewById(R.id.webView);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webSettings.setAllowUniversalAccessFromFileURLs(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setGeolocationEnabled(true)

Am I missing something? Thank you for your help.

like image 888
dchamb Avatar asked Jan 25 '16 06:01

dchamb


People also ask

Does Chrome use WebView?

No, Chrome for Android is separate from WebView. They're both based on the same code, including a common JavaScript engine and rendering engine.

What browser is used in WebView?

On Android 7.0, 8.0 and 9.0, Google Chrome handles the embedded browsing functions. On other Android OS versions, web app performance may suffer without WebView enabled.


1 Answers

You have to import android.webkit.GeolocationPermissions.Callback and android.webkit.WebChromeClient just to Set the Geolocation permission state for the supplied origin by calling callback.invoke(origin, true, false); in onGeolocationPermissionsShowPrompt method of WebChromeClient like below

Code

      mWebView = (WebView) findViewById(R.id.mywebview);
      WebSettings webSettings = mWebView.getSettings();
      webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                view.loadUrl(url);
                return true;
            }
        });

        webSettings.setJavaScriptEnabled(true);
        webSettings.setGeolocationEnabled(true);

        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onGeolocationPermissionsShowPrompt(String origin,
                    Callback callback) {

                callback.invoke(origin, true, false);
            }
        });

        mWebView.loadUrl("http://www.google.com");

and you have to add 2 manifest permission's as

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Hope it works.

like image 149
Kapil Rajput Avatar answered Sep 22 '22 12:09

Kapil Rajput