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