Usando navigator.geolocation.getCurrentPosition en WebView en Android 2.0+ (relacionados con PhoneGap)

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

Pregunta

He estado trabajando con PhoneGap y ha sido genial, pero me he encontrado con un problema al obtener la ubicación en un Droid de Verizon w / 2.0.1 (obras como debería en un G1 w / 1.6).

Soporte API de geolocalización ha sido añadido a Android 2.0 (Eclair) y funciona en el navegador por defecto en un Droid de Verizon (en 2.0.1). Es decir, si me visita un sitio web que llama navigator.geolocation.getCurrentPosition (success_callback, error_callback), el dispositivo solicita que el dominio actual "quiere saber su ubicación" en un cuadro de diálogo con opciones para "Compartir ubicación" o "disminución". Si selecciono "Compartir ubicación", success_callback finalmente es llamado con datos de localización.

Si vuelvo a visitar el mismo sitio web en una vista Web, la llamada a navigator.geolocation.getCurrentPosition no genera un javascript error, pero el "compartir su ubicación" de diálogo no se muestra y no devolución de llamada alguna vez se llamó. En Logcat, veo lo que parece ser un error relacionado: "02-15 10: 37: 00,413: ERROR / GeoLocationService (16871):.. Caught excepción de seguridad de registrarse para actualizaciones de ubicación de sistema Esto sólo debería ocurrir en DumpRenderTree"

Me parece que la vista Web está fallando para registrarse para las actualizaciones de ubicación, ya que no tiene el permiso necesario, que a su vez es el resultado de no solicitar al usuario el permiso. Aunque hubo varios métodos y objetos añadidos al paquete de Webkit en Android 2.0 en relación con GeoPermissions, no he sido capaz de utilizar cualquiera de ellos para causar WebView para mostrar el diálogo GeoPermission.

Lo siguiente se basa en el Hola, WebView ejemplo de la Guía del desarrollador de Android, pero añade algunas de las llamadas y los objetos que se agregaron en 2,0 relacionada con GeoPermissions. * Se ha actualizado con una dirección URL correspondiente (con el permiso de el autor -. gracias Oliver )

¿Alguien ha sido capaz de conseguir este trabajo? Cualquier comentario sería muy bueno, 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);
}

}

}
¿Fue útil?

Solución

Sólo traté su código en un Nexus One con Android 2.1, y funciona bien. Recuerde que usted tendrá que añadir los permisos necesarios para su manifiesto:

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

Otros consejos

(el equipo PhoneGap) ha publicado recientemente una solución para este. Básicamente, el problema era que a partir de Android 2.0, la vista Web nativa tiene ahora su propia implementación de navigator.geolocation, y por lo tanto el puente PhoneGap para esta función no se estaba configurado correctamente en JavaScript.

A partir de entonces, una confirmación en concreto ha creado una solución para esto: 'proxy' del objeto navigator.geolocation nativa de nuestra propia definición de este objeto. Este objeto funciona bien con el marco PhoneGap.

En esta revisión, ver el siguiente compromiso: http://github.com/ phonegap /-phonegap androide / commit / 5255f632377c36beb0b4d2620940f33b6d02b2c7

Este enlace tiene la clave http://cordova.apache.org/docs/en/ 2.5.0 / cordova_device_device.md.html

Estoy desarrollando con Android - Phonegap

añadí

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" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top