Я работал с 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), устройство запрашивает, чтобы текущий домен "хотел знать ваше местоположение" в диалоговом окне с опциями "Share location" или "снижение". Если я выберу "Share location", в итоге функция success_callback вызывается с данными о местоположении.
Если я перейду на тот же веб-сайт в WebView, вызов navigator.geolocation.getCurrentPosition не приведет к ошибке javascript, но диалог "поделиться своим местоположением" не будет отображаться, и вызов callback никогда не будет вызван. В logcat я вижу, что похоже на связанную с этим ошибку: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): зарегистрировалось исключение безопасности для обновления местоположения из системы. Это должно произойти только в DumpRenderTree".
Мне кажется, что WebView не регистрируется для обновлений местоположения, потому что у него нет требуемого разрешения, что, в свою очередь, является результатом не запроса пользователя о разрешении. Хотя в пакет Webkit в Android 2.0, связанный с GeoPermissions, добавлено несколько методов и объектов, я не смог использовать их, чтобы WebView отображал диалоговое окно GeoPermission.
Ниже приведен пример Hello, WebView из Руководства для разработчиков Android, но он добавляет некоторые вызовы и объекты, которые были добавлены в 2.0, связанные с GeoPermissions. * Обновлен с соответствующим URL (с разрешения автора - спасибо 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);
}
}
}