2010-02-15 6 views
12

Je travaille avec PhoneGap et il a été super, mais j'ai rencontré un problème à obtenir un emplacement sur Droid Verizon w/2.0. 1 (fonctionne comme prévu sur un G1 w/1.6).Utilisation de navigator.geolocation.getCurrentPosition dans WebView sur Android 2.0+ (PhoneGap liés)

API Geolocation support a été ajouté à Android dans 2.0 (Eclair) et il fonctionne dans le navigateur par défaut sur un Verizon Droid (sur 2.0.1). En d'autres termes, si je consulte un site Web qui appelle navigator.geolocation.getCurrentPosition (success_callback, error_callback), le périphérique demande que le domaine actuel "souhaite connaître votre position" dans une boîte de dialogue avec les options "Partager l'emplacement" ou "refuser". Si je sélectionne "Partager l'emplacement", success_callback sera éventuellement appelé avec les données de localisation. Si je visite le même site Web dans un WebView, l'appel à navigator.geolocation.getCurrentPosition ne génère pas d'erreur javascript, mais la boîte de dialogue «partagez votre emplacement» n'est pas affichée et aucun rappel n'est jamais appelé. Dans logcat, je vois ce qui semble être une erreur connexe: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): Exception de sécurité interceptée en enregistrant les mises à jour de l'emplacement du système, cela ne devrait se produire que dans DumpRenderTree."

Il me semble que le WebView ne parvient pas à s'inscrire pour les mises à jour de localisation car il ne dispose pas de l'autorisation requise, qui à son tour est le résultat de ne pas inviter l'utilisateur pour la permission. Bien qu'il y ait plusieurs méthodes et objets ajoutés au package Webkit dans Android 2.0 liés à GeoPermissions, je n'ai pas été en mesure d'utiliser l'un d'entre eux pour que WebView affiche la boîte de dialogue GeoPermission.

Ce qui suit est basé sur le Bonjour, par exemple WebView du Guide du développeur Android, mais il ajoute quelques-uns des appels et des objets qui ont été ajoutés dans la version 2.0 en rapport avec GeoPermissions. * Mise à jour avec une URL appropriée (avec la permission de the author - thanks Oliver!).

Est-ce que quelqu'un a été en mesure de faire fonctionner cela? Tout commentaire serait génial, merci!

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

} 

} 

Répondre

22

Je viens d'essayer votre code sur un Nexus One avec Android 2.1, et il fonctionne très bien. Rappelez-vous que vous devez ajouter les autorisations nécessaires à votre manifeste:

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

Merci pour la réponse et les informations supplémentaires, Roman. Je suis heureux d'entendre que cela est résolu en 2.1. Je suis surpris que le code que j'ai posté a fonctionné - j'ai juste jeté toutes les choses GeoPermissions là pour illustrer ce que j'essayais de faire au cas où quelqu'un pourrait me dire la bonne façon de le faire. Une idée s'il y a un moyen de le faire fonctionner dans un WebView sur 2.0.1? Actuellement je travaille autour de navigator.geolocation car il ne semble pas être utilisable dans un WebView 2.0.1. Merci encore! – ajh158

3

Nous (l'équipe PhoneGap) avons récemment publié un correctif pour cela. Fondamentalement, le problème était que depuis Android 2.0, le WebView natif a désormais sa propre implémentation de navigator.geolocation, et donc le pont PhoneGap pour cette fonction n'était pas correctement configuré en JavaScript.

Depuis lors, un particulier a créé un commit solution pour cela: nous « proxy » objet natif navigator.geolocation à notre propre définition de cet objet. Cet objet fonctionne bien avec le framework PhoneGap.

Pour ce correctif, consultez le commit: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

+0

Merci fil maj - Je savais que l'ajout de l'objet natif avait rompu PhoneGap. J'ai fini par faire quelque chose de similaire à votre solution de contournement, mais j'espérais que nous pourrions trouver un moyen d'utiliser l'objet de géolocalisation native à partir d'un WebView. Mon code était destiné à démontrer que cela ne fonctionne tout simplement pas à partir d'un WebView (phonegap ou non). – ajh158

+0

fil, je suis nouveau à l'écart téléphonique, votre engagement sera incorporé dans la prochaine version? quand? Je ne veux pas couper ma propre construction, mais si vous donnez des instructions, coupez volontiers de votre branche. –

+1

@fil, votre URL est 404. S'il vous plaît mettre à jour. –