name - Uso de navigator.geolocation.getCurrentPosition en WebView en Android 2.0+(relacionado con PhoneGap)
geolocalizacion cordova (3)
He estado trabajando con PhoneGap y ha sido genial, pero me he encontrado con un problema para obtener la ubicación en un Verizon Droid con 2.0.1 (funciona como se esperaba en un G1 con 1.6).
El soporte de GeoLocation API se agregó a Android en 2.0 (Eclair) y funciona en el navegador predeterminado en un Verizon Droid (en 2.0.1). Es decir, si visito un sitio web que llame a navigator.geolocation.getCurrentPosition (success_callback, error_callback), el dispositivo indica que el dominio actual "quiere saber su ubicación" en un cuadro de diálogo con opciones para "Compartir ubicación" o "declinar". Si selecciono "Compartir ubicación", eventualmente se llama a success_callback con los datos de ubicación.
Si visito el mismo sitio web en un WebView, la llamada a navigator.geolocation.getCurrentPosition no genera un error de javascript, pero el cuadro de diálogo "compartir su ubicación" no se muestra y nunca se llama a ninguna devolución de llamada. En logcat, veo lo que parece ser un error relacionado: "02-15 10: 37: 00.413: ERROR / geolocationService (16871): excepción de seguridad capturada que se registra para actualizaciones de ubicación del sistema. Esto solo debería ocurrir en DumpRenderTree".
Me parece que WebView no se registra para las actualizaciones de ubicación porque no tiene el permiso requerido, que a su vez es el resultado de no solicitar permiso al usuario. Aunque se agregaron varios métodos y objetos al paquete Webkit en Android 2.0 relacionado con GeoPermissions, no he podido utilizar ninguno de ellos para hacer que WebView muestre el diálogo GeoPermission.
Lo siguiente se basa en el ejemplo Hello, WebView de la Guía del desarrollador de Android, pero agrega algunas de las llamadas y objetos que se agregaron en 2.0 relacionados con GeoPermissions. * Actualizado con una url apropiada (con permiso del autor, ¡gracias Oliver !).
¿Alguien ha podido hacer que esto funcione? Cualquier comentario sería genial, gracias!
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);
}
}
}
Nosotros (el equipo de PhoneGap) hemos lanzado recientemente una solución para esto. Básicamente, el problema era que a partir de Android 2.0, el WebView nativo ahora tiene su propia implementación de navigator.geolocation, y por lo tanto, el puente PhoneGap para esta función no se estaba configurando correctamente en JavaScript.
Desde entonces, una confirmación en particular ha creado una solución alternativa para esto: ''proxy'' el objeto de navegación nativa.geolocation a nuestra propia definición de este objeto. Este objeto funciona bien con el marco PhoneGap.
Para obtener esta solución, consulte la siguiente confirmación: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7
Acabo de probar tu código en un Nexus One con Android 2.1, y funciona bien. Recuerde que deberá agregar los permisos necesarios a su manifiesto:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Este enlace tiene la clave http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html
Estoy desarrollando con Android - Phonegap
yo añadí
-> app / res / xml / config.xml
<plugin name = "Dispositivo" value = "org.apache.cordova.Device" />
-> app / AndroidManifest.xml
<uses-permission android: name = "android.permission.READ_PHONE_STATE" />
y funciona bien