L'utilisation navigator.geolocation.getCurrentPosition dans WebView sur Android 2.0+ (PhoneGap liés)

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

Question

Je travaille avec PhoneGap et ça a été super, mais j'ai rencontré un problème à obtenir un emplacement sur Verizon Droid w / 2.0.1 (fonctionne comme prévu sur un G1 w / 1.6).

API Geolocation support a été ajouté à Android dans 2.0 (Eclair) et il fonctionne dans le navigateur par défaut sur un Droid Verizon (sur 2.0.1). Autrement dit, si je visite un site Web qui appelle navigator.geolocation.getCurrentPosition (success_callback, error_callback), le dispositif demande que le domaine actuel « veut connaître votre position » dans une boîte de dialogue avec des options pour « Partager l'emplacement » ou « déclin ». Si je sélectionne « Partager emplacement », success_callback se finit par appeler avec les données de localisation.

Si je visite le même site dans une WebView, l'appel à navigator.geolocation.getCurrentPosition ne génère pas une erreur javascript, mais le « partager votre position » boîte de dialogue ne s'affiche pas et ne se rappel jamais appelé. En logcat, je vois ce qui semble être une erreur liée: « 02-15 10: 37: 00,413: ERREUR / GeoLocationService (16871):. Exception de sécurité pour l'enregistrement des mises à jour Caught emplacement de système Cela ne devrait se produire dans DumpRenderTree. »

Il me semble que le WebView ne parvient pas à enregistrer des mises à jour de l'emplacement, car il ne dispose pas de l'autorisation nécessaire, ce qui est un résultat de ne pas demander à l'utilisateur l'autorisation. Bien qu'il y ait eu plusieurs méthodes et objets ajoutés au package Webkit dans Android 2.0 lié à GeoPermissions, je ne l'ai pas été en mesure d'utiliser l'un d'eux pour provoquer WebView pour afficher 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 l'auteur -. merci Oliver )

Quelqu'un at-il été en mesure d'obtenir ce travail? Tous les commentaires 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);
}

}

}
Était-ce utile?

La solution

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" />

Autres conseils

Nous (l'équipe PhoneGap) ont récemment publié un correctif pour cela. Au fond, le problème était que d'Android 2.0, le natif WebView a maintenant sa propre implémentation de navigator.geolocation, et donc le pont PhoneGap pour cette fonction n'a pas été correctement défini dans se JavaScript.

Depuis lors, une livraison particulière a créé une solution pour cela: nous « proxy » l'objet natif de navigator.geolocation à notre propre définition de cet objet. Cet objet fonctionne bien avec le cadre PhoneGap.

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

Ce lien a la clé http://cordova.apache.org/docs/en/ 2.5.0 / cordova_device_device.md.html

Je développe avec Android - Phonegap

ajouté

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" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top