Pracowałem z PhoneGap i było świetnie, ale mam problem z uzyskaniem lokalizacji w Verizon Droid w/2.0. 1 (działa zgodnie z oczekiwaniami na G1 w/1.6).Używanie navigator.geolocation.getCurrentPosition w WebView na Androida 2.0+ (PhoneGap related)
Obsługa interfejsu API GeoLocation została dodana do systemu Android w wersji 2.0 (Eclair) i działa w domyślnej przeglądarce Verizon Droid (w wersji 2.0.1). Oznacza to, że jeśli odwiedzę stronę internetową, która wywołuje navigator.geolocation.getCurrentPosition (success_callback, error_callback), urządzenie wyświetli monit, że bieżąca domena "chce znać twoją lokalizację" w oknie dialogowym z opcjami "Udostępnij lokalizację" lub "odrzuć". Jeśli wybiorę opcję "Udostępnij lokalizację", success_callback zostanie ostatecznie wywołana z danymi o lokalizacji.
Jeśli odwiedzę tę samą stronę internetową w WebView, wywołanie funkcji navigator.geolocation.getCurrentPosition nie generuje błędu javascript, ale okno dialogowe "udostępnij swoją lokalizację" nie jest wyświetlane, a wywołanie zwrotne nie jest wywoływane. W logcat widzę, co wydaje się być związany z błędem: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): Wykryto wyjątek Caught Security dla aktualizacji lokalizacji z systemu. To powinno się zdarzyć tylko w DumpRenderTree."
Wydaje mi się, że WebView nie rejestruje się w poszukiwaniu aktualizacji lokalizacji, ponieważ nie ma wymaganych uprawnień, co z kolei jest wynikiem niezapytania użytkownika o pozwolenie. Chociaż do pakietu Webkit w systemie Android 2.0 związanych z GeoPermissions dodano kilka metod i obiektów, nie mogłem użyć żadnego z nich, aby spowodować, że WebView wyświetli okno dialogowe GeoPermission.
Poniższy dokument oparty jest na przykładzie Hello, WebView z Przewodnika dla programistów Androida, ale dodaje niektóre z połączeń i obiektów dodanych w wersji 2.0 związanej z GeoPermissions. * Zaktualizowano odpowiednim adresem URL (za zgodą the author - thanks Oliver!).
Czy ktoś mógł to sprawdzić? Wszelkie opinie będą wspaniałe, dzięki!
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);
}
}
}
Dzięki za odpowiedź i dodatkowe informacje, Roman. Cieszę się, że jest to rozwiązane w wersji 2.1. Jestem zaskoczony, że napisany przeze mnie kod zadziałał - właśnie wyrzuciłem tam wszystkie materiały GeoPermissions, aby zilustrować, co próbowałem zrobić, aby ktoś mógł mi powiedzieć, jak to zrobić. Masz pomysł, czy jest jakiś sposób, aby działał w WebView 2.0.1? Obecnie pracuję nad navigator.geolocation, ponieważ nie wydaje się być użyteczny w 2.0.1 WebView. Dzięki jeszcze raz! – ajh158