Uso del navigatore.geolocalizzazione.getCurrentPosition in WebView su Android 2.0+ (PhoneGap correlati)

StackOverflow https://stackoverflow.com/questions/2267513

Domanda

Ho lavorato con PhoneGap ed è stato grande, ma ho incontrato un problema con ottenere la posizione su una Verizon Droid w/ 2.0.1 (funziona come previsto in un G1 w/ 1.6).

Le API di geolocalizzazione è stato aggiunto il Supporto per Android 2.0 (Eclair) e funziona nel browser predefinito su Verizon Droid (su 2.0.1).Che è, se visito un sito che si chiama navigator.geolocalizzazione.getCurrentPosition(success_callback, error_callback), il dispositivo richiede che l'attuale dominio "vuole sapere la tua posizione" in una finestra di dialogo con le opzioni "Condividi posizione" o "rifiuta".Se seleziono l'opzione "Condividi posizione", success_callback alla fine viene chiamato con i dati di localizzazione.

Se visito il sito stesso in una WebView, la chiamata al navigatore.geolocalizzazione.getCurrentPosition non genera un errore di javascript, ma il "condividere la tua posizione" finestra di dialogo non viene visualizzata, e né la callback viene mai chiamato.Nel logcat, vedo quello che sembra essere un errore relative al:"02-15 10:37:00.413:ERRORE/geolocationService(16871):Preso eccezione di protezione della registrazione per la posizione aggiornamenti dal sistema.Questo dovrebbe accadere solo in DumpRenderTree."

Mi sembra che la WebView non riesce a iscriversi per gli aggiornamenti di posizione, perché non ha l'autorizzazione necessaria, che a sua volta è un risultato di non richiedere all'utente l'autorizzazione.Anche se ci sono diversi metodi e gli oggetti aggiunti al Webkit pacchetto in Android 2.0 relative al GeoPermissions, non sono stato in grado di utilizzare qualsiasi di loro a causa WebView per visualizzare il GeoPermission finestra di dialogo.

Il seguente è basato sul Ciao, WebView esempio da Android Developer Guide, ma si aggiunge un po ' di chiamate e gli oggetti che sono stati aggiunti nella versione 2.0 relative al GeoPermissions.*Aggiornato con un url (con il permesso l'autore - grazie Oliver!).

Nessuno è stato in grado di ottenere questo lavoro?Qualsiasi commento sarebbe grande, grazie!

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

}

}
È stato utile?

Soluzione

Ho appena provato il tuo codice su un Nexus One con Android 2.1 e funziona benissimo.Ricordate che avrete bisogno di aggiungere delle autorizzazioni necessarie per il manifesto:

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

Altri suggerimenti

Noi (PhoneGap team) ha recentemente rilasciato un fix per questo.Fondamentalmente, il problema era che, come di Android 2.0, il nativo WebView ora ha la sua implementazione di navigatore.geolocalizzazione, e quindi il bridge PhoneGap per questa funzione non è stato impostato correttamente in JavaScript.

Da allora, un particolare commit ha creato una soluzione per questo:ci 'proxy' nativo navigatore.geolocalizzazione oggetto di nostra definizione di questo oggetto.Questo oggetto funziona bene con il framework PhoneGap.

Per questo aggiornamento, vedere il seguente commit: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

Questo link ha la chiave http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

Sto sviluppando con Android - Phonegap

Ho aggiunto

app/res/xml/config.xml

<plugin name="Device" value="org.apache.cordova.Device" />

app/AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top