在 Android 2.0+ 上的 WebView 中使用 navigator.geolocation.getCurrentPosition(PhoneGap 相关)
Posted
技术标签:
【中文标题】在 Android 2.0+ 上的 WebView 中使用 navigator.geolocation.getCurrentPosition(PhoneGap 相关)【英文标题】:Using navigator.geolocation.getCurrentPosition in WebView on Android 2.0+ (PhoneGap related) 【发布时间】:2011-01-17 01:45:24 【问题描述】:我一直在使用 PhoneGap,它非常棒,但我在 Verizon Droid w/2.0.1 上获取位置时遇到了问题(在 G1 w/1.6 上按预期工作)。
GeoLocation API 支持已在 2.0 (Eclair) 中添加到 android,它可以在 Verizon Droid(2.0.1 上)的默认浏览器中运行。也就是说,如果我访问一个调用 navigator.geolocation.getCurrentPosition(success_callback, error_callback) 的网站,设备会在带有“共享位置”或“拒绝”选项的对话框中提示当前域“想知道您的位置”。如果我选择“共享位置”,success_callback 最终会被调用位置数据。
如果我在 WebView 中访问同一个网站,对 navigator.geolocation.getCurrentPosition 的调用不会生成 javascript 错误,但不会显示“共享您的位置”对话框,也不会调用任何回调。在 logcat 中,我看到似乎是一个相关的错误:“02-15 10:37:00.413: ERROR/geolocationService(16871): Caught security exception registering for location updates from system. 这应该只发生在 DumpRenderTree 中。”
在我看来,WebView 未能注册位置更新,因为它没有所需的权限,而这又是未提示用户获得权限的结果。尽管在 Android 2.0 中的 Webkit 包中添加了几个与 GeoPermissions 相关的方法和对象,但我无法使用它们中的任何一个来使 WebView 显示 GeoPermission 对话框。
以下内容基于 Android 开发人员指南中的 Hello, WebView 示例,但它添加了一些在 2.0 中添加的与 GeoPermissions 相关的调用和对象。 *使用适当的 url 更新(获得the author - thanks Oliver的许可!)。
有没有人能够让这个工作?任何反馈都会很棒,谢谢!
package com.example.android.helloactivity;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.GeolocationPermissions.Callback;
public class HelloActivity extends Activity implements GeolocationPermissions.Callback
WebView webview;
String geoWebsiteURL = "http://maxheapsize.com/static/html5geolocationdemo.html";
public HelloActivity()
/**
* Called with the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setGeolocationEnabled(true); //seems like if i set this, the webview should prompt when I call navigator.geolocation.getCurrentPosition
GeolocationPermissions geoPerm = new GeolocationPermissions(); //added in API Level 5 but no methods exposed until API level 7
GeoClient geo = new GeoClient();
webview.setWebChromeClient(geo);
String origin = ""; //how to get origin in correct format?
geo.onGeolocationPermissionsShowPrompt(origin, this); //obviously not how this is meant to be used but expected usage not documented
webview.loadUrl(geoWebsiteURL);
public void invoke(String origin, boolean allow, boolean remember)
final class GeoClient extends WebChromeClient
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback)
// TODO Auto-generated method stub
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
【问题讨论】:
【参考方案1】:我刚刚在装有 Android 2.1 的 Nexus One 上尝试了您的代码,它运行良好。请记住,您需要为清单添加必要的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
【讨论】:
感谢罗马的回复和其他信息。我很高兴听到这在 2.1 中得到了解决。我很惊讶我发布的代码能正常工作——我只是把所有 GeoPermissions 的东西都扔进去了,以说明我想要做什么,以防有人能告诉我正确的方法。知道是否有办法让它在 2.0.1 的 WebView 中工作?目前我正在处理 navigator.geolocation,因为它似乎无法在 2.0.1 WebView 中使用。再次感谢!【参考方案2】:我们(PhoneGap 团队)最近发布了针对此问题的修复程序。基本上,问题在于,从 Android 2.0 开始,本机 WebView 现在拥有自己的 navigator.geolocation 实现,因此该函数的 PhoneGap 桥接器在 JavaScript 中没有正确设置。
从那时起,一个特定的提交为此创建了一个解决方法:我们将本机 navigator.geolocation 对象“代理”到我们自己对该对象的定义。该对象适用于 PhoneGap 框架。
有关此修复,请参阅以下提交:http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7
【讨论】:
感谢 fil maj - 我知道添加本机对象打破了 phonegap。我最终做了类似于你的解决方法的事情,但我希望我们能找到一种方法来利用 WebView 中的本地地理定位对象。我的代码旨在证明这根本不适用于 WebView(phonegap 或 no)。 fil,我是 phone gap 的新手,你的提交会包含在下一个版本中吗?什么时候?我不想削减我自己的构建,但如果你给出指示,我很乐意从你的分支中削减。【参考方案3】:此链接有密钥 http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html
我正在使用 Android 开发 - Phonegap
我加了
app/res/xml/config.xml
<plugin name="Device" value="org.apache.cordova.Device" />
app/AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
【讨论】:
以上是关于在 Android 2.0+ 上的 WebView 中使用 navigator.geolocation.getCurrentPosition(PhoneGap 相关)的主要内容,如果未能解决你的问题,请参考以下文章
Android 7.0 上的 Android WebView InflateException
如何在 Android 上的 webView 中显示 YouTube 视频