我正在使用navigator.geolocation.getCurrentPosition()获取用户的当前位置.将这些网页上的位置功能直接加载到iOS和Android上的网络浏览器中时,效果很好.询问用户是否允许访问位置,该位置就从那里访问.不管哪个Web浏览器或OS都可以正常工作.
但是,如果在嵌入Android的应用程序(在这种情况下为TWebBrowser组件)中嵌入的Web浏览器中加载了相同的网页,则定位服务将不起作用.调用navigator.geolocation.getCurrentPosition()会导致Permission_denied错误消息.甚至没有询问用户是否允许访问位置;它只会引发Permission_denied错误.
我检查了一些明显的事情:
>代码前面是if(navigator.geolocation){,所以我知道
有地理定位功能.
>该应用的构建和部署具有位置服务的权限,当该应用访问代码中其他位置的位置服务(在浏览器外部,
那是).
>被拒绝的权限仅在网页嵌入到应用程序中嵌入的Web浏览器中时发生.
>仅在Android上发生. iOS运行正常.
>嵌入在应用程序中的Web浏览器将调用设备上可用的本机Web浏览器.也就是说,所使用的网络浏览器不是一些特殊的自定义浏览器.该应用程序是使用Delphi Firemonkey构建的,并使用TWebBrowser组件.
我一直在具有不同Android版本的多个Android设备(直到最新的v6)上进行了尝试,它们的行为都相同.这使我认为我正在遇到一些Android OS的“功能”.有没有解决的办法,因为我的应用程序功能还取决于从网页访问位置服务的能力.
解决方法是,从应用程序调用网页时,我会将当前位置传递给参数中的网页.但是当用户四处移动时,我无法使用WatchLocation更新地图上的位置.
解决方法:
您可以使用此代码先检查权限
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;
}