6

Śledziłem ten tutorial: http://android-er.blogspot.com/2013/03/embed-google-map-in-webview.htmlWbudowany Google Map nie można uzyskać bieżącą lokalizację w WebView

staram się po prostu korzystać z Map Google w WebView, ale nie może dostać moją aktualną lokalizację. Włączyłem JavaScript w WebView. Co jeszcze muszę włączyć?

Czy ktoś wie, dlaczego tak się dzieje? Czy nie powinienem poprosić mnie o skorzystanie z mojej bieżącej lokalizacji?

Zauważ, że nie jestem zainteresowany wykorzystaniem MapView jako alternatywy. Próbuję dowiedzieć się, co muszę ustawić w WebView, a może w usługach lokalizacyjnych urządzenia?

+0

Poważnie? Nikt inny nie wpadł na ten problem? – user5243421

+0

Hi Darren Wpadłem na ten sam problem i rozwiązanie @ Kumait naprawiło to. Powinieneś wypróbować to samo rozwiązanie i jeśli to działa, zaakceptuj to jako odpowiedź. – MediumOne

Odpowiedz

2

Należy zezwolić na widok internetowy dostęp do lokalizacji poprzez nadpisanie metody onGeolocationPermissionsShowPrompt tak:

webView.setWebChromeClient(new WebChromeClient(){ 

     @Override 
     public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
      callback.invoke(origin, true, false); 
     } 
    }); 
0

Trzeba by umożliwić android.permission.ACCESS_FINE_LOCATION i android.permission.INTERNET,

Tworzenie LocationManager instancji i LocationListener instancji

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
LocationListener locationListener = new MyLocationListener(); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, locationListener); 

i dodać onLocationChanged(Location loc) sposób, że wewnątrz niej mieć swój loc wygenerowania długość i szerokość geograficzną (String long = loc.getLongitude(); String lat = loc.getLatitude();)

i teraz używaj long, lat do generowania swojej mapPath łańcuch i dalej do generowania WebView

Można to wykorzystać do ref: http://www.rdcworld-android.blogspot.in/2012/01/get-current-location-coordinates-city.html

+0

Nie sądzę, abym to wyjaśnił, ale link, który podaję, powinien działać po wyjęciu z pudełka. W przypadku mojego konkretnego problemu tworzę witrynę mobilną, która korzysta z interfejsu API Google Maps w języku JavaScript, więc nie mam żadnej kontroli nad natywnym WebView. – user5243421

1

Na API 5.x oraz poniżej, trzeba będzie

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

w swoim AndroidManifest.xml.

Ale aby zezwolić na uprawnienia do geolokalizacji w API 6.0+, musisz request the permission at runtime.

Request location permission

Aby to zrobić, należy użyć

private String mGeolocationOrigin; 
private GeolocationPermissions.Callback mGeolocationCallback; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // other setup 

    myWebView.setWebChromeClient(new MyWebChromeClient()); 
} 

private WebChromeClient mWebChromeClient = new 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 < 23. 
     // On API 23 and above, we must check for permission, and possibly ask for it. 
     final String permission = Manifest.permission.ACCESS_FINE_LOCATION; 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || 
       ContextCompat.checkSelfPermission(MainActivity.this, permission) == PackageManager.PERMISSION_GRANTED) { 
      // we're on SDK < 23 OR user has already granted permission 
      callback.invoke(origin, true, false); 
     } else { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) { 
       // user has denied this permission before and selected [/] DON'T ASK ME AGAIN 
       // TODO Best Practice: show an AlertDialog explaining why the user could allow this permission, then ask again 
      } else { 
       // ask the user for permissions 
       ActivityCompat.requestPermissions(MainActivity.this, new String[] {permission}, RP_ACCESS_LOCATION); 
       mGeolocationOrigin = origin; 
       mGeolocationCallback = callback; 
      } 
     } 
    } 
} 

i otrzymać wynik:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case RP_ACCESS_LOCATION: 
      boolean allow = false; 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // user has allowed these permissions 
       allow = true; 
      } 
      if (mGeolocationCallback != null) { 
       mGeolocationCallback.invoke(mGeolocationOrigin, allow, false); 
      } 
      break; 
    } 
} 

w swojej działalności.

Powiązane problemy