Я работал с PhoneGap, и это было здорово, но я столкнулся с проблемой получения местоположения на Verizon Droid w / 2.0.1 (работает, как и ожидалось, на G1 w / 1.6).
Поддержка API GeoLocation была добавлена в 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, я не смог использовать ни один из них, чтобы WebView отображал диалоговое окно GeoPermission.
Нижеследующее основано на примере Hello, WebView из Руководства разработчика Android, но добавляет некоторые вызовы и объекты, которые были добавлены в 2.0, связанные с GeoPermissions. * Обновлено с соответствующим URL (с разрешения автор - спасибо Оливер !).
Кто-нибудь смог заставить это работать? Любой отзыв будет отличным, спасибо!
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);
}
}
}