Ich habe mit PhoneGap gearbeitet und es war großartig, aber ich habe ein Problem mit der Lage auf einem Verizon Droid w/2.0 bekommen. 1 (funktioniert wie erwartet auf einem G1 w/1,6).Verwendung von navigator.geolocation.getCurrentPosition in WebView auf Android 2.0+ (mit PhoneGap verwandt)
GeoLocation API Unterstützung wurde zu Android in 2.0 (Eclair) hinzugefügt und es funktioniert im Standard-Browser auf einem Verizon Droid (auf 2.0.1). Das heißt, wenn ich eine Website besuche, die navigator.geolocation.getCurrentPosition aufruft (success_callback, error_callback), fordert das Gerät in einem Dialogfeld mit den Optionen "Standort teilen" oder "ablehnen" die aktuelle Domäne "möchte Ihren Standort wissen" an. Wenn ich "Speicherort freigeben" wähle, wird success_callback schließlich mit Standortdaten aufgerufen.
Wenn ich die gleiche Website in einem WebView besuche, erzeugt der Aufruf von navigator.geolocation.getCurrentPosition keinen JavaScript-Fehler, aber der Dialog "share your location" wird nicht angezeigt und keiner der Callbacks wird jemals aufgerufen. In Logcat sehe ich, was ein ähnlicher Fehler zu sein scheint: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): Erfassung der Sicherheitsausnahme, die sich für Standortaktualisierungen vom System registriert. Dies sollte nur in DumpRenderTree passieren."
Es scheint mir, dass das WebView sich nicht für Standortaktualisierungen registrieren kann, da es nicht über die erforderliche Berechtigung verfügt, was wiederum darauf zurückzuführen ist, dass der Benutzer nicht um die Berechtigung gebeten wird. Obwohl dem Webkit-Paket in Android 2.0 im Zusammenhang mit GeoPermissions mehrere Methoden und Objekte hinzugefügt wurden, konnte ich keine davon verwenden, um zu bewirken, dass WebView den GeoPermission-Dialog anzeigt.
Das Folgende basiert auf dem Beispiel Hello, WebView aus dem Android Developer's Guide, fügt jedoch einige der Aufrufe und Objekte hinzu, die in 2.0 zu GeoPermissions hinzugefügt wurden. * Mit einer entsprechenden URL aktualisiert (mit Genehmigung von the author - thanks Oliver!).
Hat jemand in der Lage, das funktioniert zu bekommen? Jede Rückmeldung wäre großartig, danke!
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);
}
}
}
Danke für die Antwort und die zusätzlichen Informationen, Roman. Es freut mich zu hören, dass dies in 2.1 gelöst ist. Ich bin überrascht, dass der Code, den ich gepostet habe, funktioniert hat - ich habe einfach alle GeoPermissions-Sachen hineingeschmuggelt, um zu illustrieren, was ich zu tun versuchte, für den Fall, dass mir jemand den richtigen Weg zeigen könnte. Irgendeine Idee, wenn es eine Möglichkeit gibt, es in einem WebView auf 2.0.1 funktionieren zu lassen? Momentan arbeite ich an navigator.geolocation, weil es in einem 2.0.1 WebView nicht verwendbar zu sein scheint. Danke noch einmal! – ajh158