/ / Posizione geografica non accessibile da una pagina Web su Android quando si utilizza il browser incorporato in un'app: javascript, android, delphi, geolocalizzazione, twebbrowser

Posizione geografica non accessibile da una pagina Web su Android quando si utilizza il browser incorporato in un'app: javascript, android, delphi, geolocalizzazione, twebbrowser

sto usando navigator.geolocation.getCurrentPosition() per ottenere la posizione corrente dell'utente. La funzione di localizzazione in queste pagine web funziona correttamente quando caricata direttamente in un browser Web su iOS e Android. L'utente viene chiesto se consente l'accesso alla posizione, e va da lì. Non importa quale browser o sistema operativo - funzionano tutti bene.

Tuttavia, se la stessa pagina Web è caricata in un browser web incorporato in un'app in esecuzione su Android (componente TWebBrowser in questo caso), il servizio di localizzazione non funziona. Una chiamata a navigator.geolocation.getCurrentPosition() risultati in permission_denied messaggio di errore. L'utente NON viene nemmeno chiesto se consentirebbe l'accesso alla posizione; solleva solo l'errore permission_denied.

Alcune delle cose ovvie che ho controllato:

  • Il codice è preceduto da if (navigator.geolocation) { quindi lo so la capacità di geolocalizzazione è lì.
  • L'app è costruita e distribuita con le autorizzazioni ai servizi di localizzazione, il che funziona bene in quanto l'app accede ai servizi di localizzazione in altri punti del codice (al di fuori del browser, questo è).
  • L'autorizzazione negata si verifica solo in una pagina Web quando viene caricata nel browser Web incorporato nell'app.
  • Succede solo su Android. iOS funziona bene.
  • Il browser web incorporato nell'app richiama ilbrowser Web nativo disponibile sul dispositivo. Cioè, il browser Web in uso non è uno speciale personalizzato. L'app è costruita utilizzando Delphi Firemonkey e utilizza il componente TWebBrowser.

Ho provato su diversi dispositivi Android condiverse versioni di Android fino alla v6 più recente e si comportano tutte allo stesso modo. Ciò mi porta a pensare che sto correndo su alcune "funzionalità" del sistema operativo Android. Esiste un modo per aggirarlo dato che le mie funzionalità delle app dipendono anche dall'accesso ai servizi di localizzazione dalla pagina web.

Come soluzione temporanea, sto passando la posizione corrente alla pagina web nei parametri quando la chiamo dall'app. Ma non posso usare WatchLocation per aggiornare la posizione sulla mappa quando l'utente si muove.

risposte:

3 per risposta № 1

puoi usare questo codice per verificare prima le autorizzazioni

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}