web-dev-qa-db-fra.com

La géolocalisation Phonegap/Cordova ne fonctionne pas sur Android

Je ne parviens pas à faire fonctionner la géolocalisation sous Android dans l'émulateur (même lorsque je geo fix sur telnet) et sur le périphérique. Fonctionne sur iOS, WP8 et dans le navigateur.

Lorsque je demande au périphérique l’emplacement à l’aide du code suivant, j’obtiens toujours une erreur (dans mon cas, personnalisez Retrieving your position failed for unknown reason. avec null avec le code et le message d’erreur).

Code associé:

    successHandler = (position) ->
      resolve App.Location.create
        lat: position.coords.latitude
        lng: position.coords.longitude

    errorHandler = (error) ->
      error = switch error.code
        when 1
          App.LocationError.create
            message: 'You haven\'t shared your location.'
        when 2
          App.LocationError.create
            message: 'Couldn\'t detect your current location.'
        when 3
          App.LocationError.create
            message: 'Retrieving your position timeouted.'
        else
          App.LocationError.create
            message: 'Retrieving your position failed for unknown reason. Error code: ' + error.code + '. Error message: ' + error.message

      reject(error)

    options =
      maximumAge: Infinity # I also tried with 0
      timeout: 60000
      enableHighAccuracy: true
    navigator.geolocation.getCurrentPosition(successHandler, errorHandler, options)

plateformes/Android/AndroidManifest.xml

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

www/config.xml (juste au cas où)

<feature name="Geolocation">
    <param name="Android-package" value="org.Apache.cordova.GeoBroker" />
</feature>

Utilisation de Cordova 3.1.0. Test sur Android 4.2. Plugin installé. Cordova.js est inclus dans index.html (d’autres plugins comme InAppBrowser fonctionnent bien).

$ cordova plugins ls
[ 'org.Apache.cordova.console',
'org.Apache.cordova.device',
'org.Apache.cordova.dialogs',
'org.Apache.cordova.geolocation',
'org.Apache.cordova.inappbrowser',
'org.Apache.cordova.vibration' ]

Je suis désemparé. Est-ce que je manque quelque chose?

20
Kreeki

Essayez les options de cette façon pour voir si cela fonctionne pour vous comme cela l’a été pour moi:

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
15
ASP Force

Ma solution consistait à utiliser le support natif de géolocalisation HTML5 pour Android/samsung, le cas échéant:

// BEFORE the deviceready event has fired:

// Check if HTML5 location support exists
app.geolocation = false;
if(navigator.geolocation) {
  app.geolocation = navigator.geolocation;
} 

// AFTER the deviceready event:

if(app.geolocation) {
  var locationService = app.geolocation; // native HTML5 geolocation
}
else {
  var locationService = navigator.geolocation; // cordova geolocation plugin
}

locationService.getCurrentPosition(
    function(pos) {

    },
    function(error) {

    }, 
    {enableHighAccuracy: true, timeout: 15000}
);

Pour tous les appareils samsung avec lesquels j'ai testé, enableHighAccuracy devait être "vrai" pour que cela fonctionne. EnableHighAccuracy peut également être défini sur "false" avec des périphériques non Samsung tels que le Nexus 7.

6
henryfi

Essaye ça,

Supprimer le plugin de géolocalisation

cordova plugin rm org.Apache.cordova.geolocation

Cependant, assurez-vous que les propriétés AndroidManifest.xml et config.xml restent telles quelles.

(in app/res/xml/config.xml)
<feature name="Geolocation">
    <param name="Android-package" value="org.Apache.cordova.GeoBroker" />
</feature>


(in app/AndroidManifest.xml)
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

Et pour iOS dans config.xml

<feature name="Geolocation">
    <param name="ios-package" value="CDVLocation" />
</feature>

Ensuite, créez l’application à l’aide de la CLI et exécutez-la sur le périphérique/émulateur. Vous constaterez que vous obtenez maintenant le code d'erreur ainsi que le message onError pour getlocation.

PLUS D'INFORMATIONS: Même après avoir suivi les étapes ci-dessus, vous pouvez recevoir le message de délai d'attente de manière cohérente même après avoir défini {timeout:10000}. La solution à ce problème est assez amusante: il suffit d’éteindre votre appareil, de le rallumer et de relancer l’application. Vous devriez être surpris de voir cela fonctionner, tout comme moi!

6
Dipin Krishnan

À l'aide de Phonegap et Genymotion, le successHandler n'a jamais été appelé lorsque j'ai essayé de getCurrentPosition. Ajout des options:

{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0}

résolu cela pour moi.

5
Maxirus

Selon https://issues.Apache.org/jira/browse/CB-5977 , le support du plugin Android a été supprimé . Yi Ming Kuan a déclaré WebView sur les nouvelles versions d'Android obtiendra des verrous GPS plus rapidement que l'API native, d'où sa suppression. Ajouter le plugin sur Android ajoute simplement les autorisations nécessaires pour utiliser HTML5 Géolocalisation dans votre application.

3
romgar
  • vérifiez vos fichiers config.xml.

supprimer cette ligne 

<preference name="permissions" value="none"/>
  • regardez dans votre AndroidManifest.xml

vérifiez que toutes les lignes <uses-permission...> et la ligne <uses-sdk...> sont situées avant la balise <application...>

après cela, désinstallez l'application manuellement sur le téléphone et réinstallez-la.

j'espère que cela pourra aider.

lg

fastrde

2
fastr.de

Je pense que vous ajoutez le plugin manuellement. utilisez la commande: (strictement si vous utilisez la construction CLI)

phonegap local plugin add https://git-wip-us.Apache.org/repos/asf/cordova-plugin-geolocation.git
1
Sandeep vashisth

l'ajout de l'autorisation ci-dessous dans le fichier manifeste a résolu mon problème

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
0
Maurice

Si le code d'erreur était 3, vérifiez si l'emplacement dans les paramètres est activé ..__ C'est un travail pour moi.

0
Yuri Giovani

J'ai le même problème avec vous, mais finalement je l'ai résolu.

La raison de ce problème est que nous utilisons toujours la fonction navigator.geolocation.getCurrentPosition du navigateur pour localiser la position. Nous devons donc laisser l'application utiliser l'implémentation native cordova au lieu de html5.

0
WuZhonghua