Използвам navigator.geolocation.getCurrentPosition()
за да получите текущото местоположение на потребителя. Функцията за местоположение на тези уеб страници работи добре, когато се зарежда директно в уеб браузър на iOS и Android. Потребителят получава въпрос дали позволява достъп до местоположение и отива оттам. Не е важно кой уеб браузър или операционна система - всички те работят добре.
Ако обаче една и съща уеб страница е заредена в уеб браузър вграден в приложение който работи в Android (компонент TWebBrowser в този случай), услугата за местоположението не работи. Обаждане до navigator.geolocation.getCurrentPosition()
резултати в permission_denied
съобщение за грешка. Потребителят дори не е попитан дали ще позволи достъп до местоположението; това просто повдига грешка permission_denied.
Някои от очевидните неща, които проверих:
- Кодът се предхожда
if (navigator.geolocation) {
така че аз знам това възможностите за геолокация са налице. - Приложението е изградено и внедрено с разрешения за услуги за местоположението, което работи добре, когато приложението осъществява достъп до услугите за местоположения на други места в кода (извън браузъра, това е).
- Отхвърленото разрешение се случва само в уеб страница, когато се зарежда в уеб браузъра, вграден в приложението.
- Това се случва само на Android. iOS работи добре.
- Уеб браузърът, вграден в приложението, извиквароден уеб браузър на устройството. Това означава, че използваният уеб браузър не е специален персонализиран. Приложението е изградено с помощта на Delphi Firemonkey и използва компонента TWebBrowser.
Опитах го на няколко устройства с Androidразлични версии на Android до края на последната v6 и всички те се държат еднакви. Това ме кара да мисля, че се захващам с някои "OS" функции на операционната система Android. Има ли някакъв начин около това, тъй като функционалността на моите приложения зависи и от достъпа до услуги за местоположение от уеб страницата.
Като алтернатива, преминавам текущото местонахождение към уеб страницата в параметри, когато я извиквам от приложението. Но не мога да използвам WatchLocation, за да актуализирам позицията на картата, когато потребителят се движи.
Отговори:
3 за отговор № 1можете да използвате този код, за да проверите първо разрешенията
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;
}