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

我一直在使用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:错误/ geolocationService(16871):抓住安全异常注册从系统的位置更新,这应该只发生在DumpRenderTree.

在我看来,WebView无法注册位置更新,因为它没有必要的权限,这反过来又是不能提示用户获得权限的结果.尽管有几种方法和对象添加到Android 2.0中的与GeoPermissions相关的Webkit包中,但我无法使用任何方法来使WebView显示GeoPermission对话框.

以下是基于Android开发人员指南中的Hello,WebView示例,但它添加了与GeoPermissions相关的2.0中添加的一些调用和对象. *更新了适当的网址(有权限从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);
}

}

}
我刚刚尝试使用Android 2.1的Nexus One上的代码,它的工作正常.请记住,您需要为清单添加必要的权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
相关文章
相关标签/搜索