title: Does not have sufficient Geolocation Permissions Android Webview
body: <p>Good Evening. I'm on making Tracking Application on Android using Webview. i got problem because the system all works well beside the location. i've tried some method from Mr. Grishma Ukani (Big Thanks).</p>
  
  <pre><code>package com.example.webview;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.webkit.GeolocationPermissions;
  import android.webkit.WebChromeClient;
  import android.webkit.WebView;
  import android.webkit.WebViewClient;
  
  /**
  * A minimal WebView app with HTML5 geolocation capability
  *
  * @author David M. Chandler
  */
  public class GeoWebViewActivity extends Activity {
  
  /**
   * WebViewClient subclass loads all hyperlinks in the existing WebView
   */
  public class GeoWebViewClient extends WebViewClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          // When user clicks a hyperlink, load in the existing WebView
          view.loadUrl(url);
          return true;
      }
  }
  
  /**
   * WebChromeClient subclass handles UI-related calls
   * Note: think chrome as in decoration, not the Chrome browser
   */
  public class GeoWebChromeClient extends WebChromeClient {
      @Override
      public void onGeolocationPermissionsShowPrompt(String origin,
              GeolocationPermissions.Callback callback) {
          // Always grant permission since the app itself requires location
          // permission and the user has therefore already granted it
          callback.invoke(origin, true, false);
      }
  }
  
  WebView mWebView;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      mWebView = (WebView) findViewById(R.id.webView1);
      // Brower niceties -- pinch / zoom, follow links in place
      mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
      mWebView.getSettings().setBuiltInZoomControls(true);
      mWebView.setWebViewClient(new GeoWebViewClient());
      // Below required for geolocation
      mWebView.getSettings().setJavaScriptEnabled(true);
      mWebView.getSettings().setGeolocationEnabled(true);
      mWebView.setWebChromeClient(new GeoWebChromeClient());
      // Load google.com
      mWebView.loadUrl("http://www.google.com");
  }
  
  @Override
  public void onBackPressed() {
      // Pop the browser back stack or exit the activity
      if (mWebView.canGoBack()) {
          mWebView.goBack();
      }
      else {
          super.onBackPressed();
      }
  }
  }
  </code></pre>
  
  <p>Everything goes well got no error left. but still can't got the device location / permission then this information appear on android studio</p>
  
  <p>E/cr_LocationProvider: Caught security exception while registering for location updates from the system. The application does not have sufficient geolocation permissions. E/cr_LocationProvider: newErrorAvailable application does not have sufficient geolocation permissions.</p>
  
  <p>then i tried to modified with links from <a href="https://stackoverflow.com/questions/33786733/insufficient-geolocation-permissions/39420657#39420657">Insufficient geolocation permissions</a>
  and put this modification on my public class GeoWebViewActivity extends Activity</p>
  
  <pre><code>private static final int REQUEST_FINE_LOCATION = 1;
  private String mGeolocationOrigin;
  private GeolocationPermissions.Callback mGeolocationCallback;
  
  public class GeoWebChromeClient extends WebChromeClient {
      @Override
      public void onGeolocationPermissionsShowPrompt(String origin,
                                                     GeolocationPermissions.Callback callback) {
          // Geolocation permissions coming from this app's Manifest will only be valid for devices with
          // API_VERSION &lt; 23. On API 23 and above, we must check for permissions, and possibly
          // ask for them.
          String perm = Manifest.permission.ACCESS_FINE_LOCATION;
          if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.M ||
                  ContextCompat.checkSelfPermission(GeoWebViewActivity.this, perm) == PackageManager.PERMISSION_GRANTED) {
              // we're on SDK &lt; 23 OR user has already granted permission
              callback.invoke(origin, true, false);
          } else {
              if (!ActivityCompat.shouldShowRequestPermissionRationale(GeoWebViewActivity.this, perm)) {
                  // ask the user for permission
                  ActivityCompat.requestPermissions(GeoWebViewActivity.this, new String[] {perm}, REQUEST_FINE_LOCATION);
  
                  // we will use these when user responds
                  mGeolocationOrigin = origin;
                  mGeolocationCallback = callback;
              }
          }
      }
  
      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          switch (requestCode) {
              case REQUEST_FINE_LOCATION:
                  boolean allow = false;
                  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                      // user has allowed this permission
                      allow = true;
                  }
                  if (mGeolocationCallback != null) {
                      // call back to web chrome client
                      mGeolocationCallback.invoke(mGeolocationOrigin, allow, false);
                  }
                  break;
          }
      }
  }
  </code></pre>
  
  <p>but got some error :</p>
  
  <ol>
  <li>Error:(67, 66) error: cannot find symbol class NonNull</li>
  <li>Error:(50, 22) error: package Build does not exist</li>
  <li>Error:(66, 9) error: method does not override or implement a method from a supertype</li>
  <li>Error:(68, 18) error: cannot find symbol method onRequestPermissionsResult(int,String[],int[]). </li>
  </ol>
  
  <p>any helps and suggestion for another method will be really appreciated.</p>