2010-02-15 4 views
12

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); 
} 

} 

} 

Antwort

22

ich Ihren Code gerade versucht, auf einem Nexus One mit Android 2.1, und es funktioniert gut. Denken Sie daran, dass Sie die erforderlichen Berechtigungen zu Ihrem Manifest hinzufügen müssen:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+0

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

3

Wir (das PhoneGap-Team) haben kürzlich eine Lösung für dieses Problem veröffentlicht. Im Grunde war das Problem, dass ab Android 2.0 das native WebView jetzt eine eigene Implementierung von navigator.geolocation hat und somit die PhoneGap Bridge für diese Funktion in JavaScript nicht richtig eingestellt wurde.

Seitdem hat eine bestimmte Festschreibung eine Abhilfe dafür geschaffen: wir "Proxy" das native navigator.geolocation Objekt zu unserer eigenen Definition dieses Objekts. Dieses Objekt funktioniert gut mit dem PhoneGap-Framework.

Für dieses Updates finden Sie im folgenden begehen: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

+0

Dank fil maj - ich wusste, dass die Zugabe des nativen Objekt phonegap gebrochen hatte. Ich habe etwas Ähnliches wie Ihre Problemumgehung gemacht, aber ich hatte gehofft, dass wir eine Möglichkeit finden könnten, das native Geolocation-Objekt in einem WebView zu verwenden. Mein Code sollte zeigen, dass dies einfach nicht von einem WebView funktioniert (Phonegap oder Nein). – ajh158

+0

fil, ich bin neu zu Telefon Lücke, wird Ihr Commit in der nächsten Version aufgenommen werden? wann? Ich möchte nicht meinen eigenen Körper schneiden, aber wenn Sie Anweisungen geben, würde gerne aus Ihrem Zweig schneiden. –

+1

@fil, Ihre URL ist 404. Bitte aktualisieren Sie. –