在Android 2.0+上使用WebView中的navigator.geolocation.getCurrentPosition(与PhoneGap相关)

时间:2010-02-15 16:53:55

标签: android geolocation webview cordova

我一直在使用PhoneGap并且它很棒,但是我遇到了在Verizon Droid w / 2.0.1上获得位置的问题(在G1 w / 1.6上按预期工作)。

GeoLocation API支持已添加到Android 2.0(Eclair)中,它可以在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):从系统注册位置更新的捕获安全异常。这应该只在DumpRenderTree中发生。”

在我看来,WebView无法注册位置更新,因为它没有所需的权限,而这又是不提示用户获得权限的结果。虽然在Android 2.0中与GeoPermissions相关的Webkit包中添加了几个方法和对象,但我无法使用它们中的任何一个来使WebView显示GeoPermission对话框。

以下内容基于Android Developer's Guide中的Hello,WebView示例,但它添加了2.0中与GeoPermissions相关的一些调用和对象。 *使用适当的网址更新(获得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);
}

}

}

3 个答案:

答案 0 :(得分:23)

我刚刚在Android 2.1的Nexus One上试过你的代码,它运行正常。请记住,您需要为清单添加必要的权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

答案 1 :(得分:4)

我们(PhoneGap团队)最近发布了针对此问题的解决方案。基本上,问题是从Android 2.0开始,原生WebView现在有了自己的navigator.geolocation实现,因此在JavaScript中没有正确设置此功能的PhoneGap桥。

从那时起,一个特定的提交为此创建了一个解决方法:我们将本机navigator.geolocation对象“委托”到我们自己对该对象的定义。这个对象适用于PhoneGap框架。

对于此修复程序,请参阅以下提交:http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

答案 2 :(得分:0)

此链接有密钥 http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

我正在开发Android - Phonegap

我添加了

应用程序/ RES / XML / config.xml中

<plugin name="Device" value="org.apache.cordova.Device" />

应用程序/ AndroidManifest.xml中

<uses-permission android:name="android.permission.READ_PHONE_STATE" />