使用嵌入在应用中的浏览器时,无法通过Android网页访问地理位置

时间:2016-03-01 15:21:05

标签: javascript android delphi geolocation twebbrowser

我正在使用navigator.geolocation.getCurrentPosition()来获取用户的当前位置。当直接加载到iOS和Android上的Web浏览器中时,这些网页上的位置功能可以正常工作。系统会询问用户是否允许访问位置,并从那里开始访问。无论哪个Web浏览器或操作系统 - 它们都可以正常工作。

但是,如果在Android上运行的应用中嵌入的网络浏览器中加载了相同的网页(在本例中为TWebBrowser组件),则位置服务不起作用。致电navigator.geolocation.getCurrentPosition()会导致permission_denied错误消息。甚至不询问用户是否允许访问位置;它只会引发permission_denied错误。

我检查了一些显而易见的事情:

  • 代码前面有if (navigator.geolocation) {,所以我知道 有地理定位能力。
  • 应用程序的构建和部署具有对位置服务的权限,当app访问代码中其他位置的位置服务时(浏览器外部, 那是)。
  • 权限被拒绝仅在网页加载到应用程序中嵌入的网络浏览器中时发生。
  • 它只发生在Android上。 iOS工作得很好。
  • 应用程序中嵌入的Web浏览器会调用设备上可用的本机Web浏览器。也就是说,正在使用的Web浏览器不是一些特殊的定制浏览器。该应用程序使用Delphi Firemonkey构建,并使用TWebBrowser组件。

我在几款Android设备上试用了不同的Android版本,一直到最新的v6,它们的行为都一样。这让我觉得我遇到了一些Android操作系统“功能”。有没有办法绕过它,因为我的应用程序功能也依赖于从网页访问位置服务。

作为一种解决方法,我在从应用程序调用它时将当前位置传递给参数中的网页。但是当用户四处移动时,我无法使用WatchLocation来更新地图上的位置。

1 个答案:

答案 0 :(得分:3)

您可以使用此代码首先检查权限

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;
        }