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

j'ai du mal à obtenir la géolocalisation sur Android dans les deux émulateurs (même si je geo fix sur telnet) et sur périphérique. Fonctionne sur iOS, WP8 et dans le navigateur.

quand je demande l'emplacement de l'appareil en utilisant le code suivant, j'obtiens toujours une erreur (dans mon cas personnalisé Retrieving your position failed for unknown reason.null à la fois le code d'erreur et message d'erreur).

code correspondant:

    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)

plates-formes/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 (un peu à l' cas)

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

Utilisant Cordova 3.1.0. Test sur Android 4.2. Plugin installé. Cordoue.js inclus dans l'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 paumé. Ai-je raté quelque chose?

19
demandé sur Kreeki 2013-10-21 14:21:21

12 réponses

Essayez les options de cette façon de voir si cela fonctionne pour vous comme il l'a fait pour moi:

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
15
répondu ASP Force 2014-03-26 15:11:56

Essayez ceci,

supprimer le plugin de géolocalisation

cordova plugin rm org.apache.cordova.geolocation

cependant, assurez-vous que L'Androidmanifeste.xml et de configuration.les propriétés xml restent comme telles

(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 en config.xml

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

ensuite, construisez l'application en utilisant CLI et lancez l'application sur le périphérique/émulateur. Vous constateriez que vous obtenez maintenant le code D'erreur ainsi que le message onError pour getlocation.

MORE INFO: même après avoir fait le au-dessus des étapes, vous pourriez recevoir le message de timeout de manière cohérente, même après avoir défini {timeout:10000}. La solution pour cela est assez drôle, il suffit d'éteindre votre appareil et de l'allumer et de lancer l'application à nouveau. Vous devriez être surpris de voir que le travail, tout comme moi!

6
répondu Dipin Krishnan 2014-03-14 05:15:43

ma solution était d'utiliser le support de géolocalisation natif HTML5 pour android / samsung s'il existait:

// 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 que j'ai testés, enablhighaccuracy devait être "vrai" pour que cela fonctionne. Avec des dispositifs non-samsung tels que le Nexus 7, enablhighaccuracy pourrait aussi être défini à 'false'.

6
répondu henryfi 2014-04-30 07:25:29

en utilisant Phonegap et Genymotion, le successHandler n'a jamais été appelé quand j'ai essayé d' getCurrentPosition. Ajout des options:

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

réparé ceci pour moi.

5
répondu Maxirus 2016-09-13 12:13:20

selon https://issues.apache.org/jira/browse/CB-5977, Le support du plugin Android a été supprimé. Yi Ming Kuan a déclaré "la raison pour laquelle nous sommes allés avec CB-5977 est que le webview sur les nouvelles versions Android va obtenir des serrures GPS plus rapidement que l'API native, d'où sa suppression. Ajouter le plugin sur Android ne fait qu'ajouter les permissions nécessaires pour utiliser la géolocalisation HTML5 dans votre application."

3
répondu romgar 2014-06-25 14:01:23
  • vérifiez votre configuration.fichier xml(s).

supprimer cette ligne

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

vérifier que tous les <uses-permission...> les lignes et le <application...> balise.

après que désinstaller l'application manuellement sur le téléphone et l'installer à nouveau.

j'espère que vous aide.

lg

fastrde

2
répondu fastr.de 2013-11-06 21:49:56

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

phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
1
répondu Sandeep vashisth 2013-11-06 12:30:25

j'ai le même problème avec vous, mais j'ai enfin résolu.

la raison de ce problème est que nous devons toujours utiliser le navigateur du navigateur.la géolocalisation.getcurrentposition function pour localiser la position, nous devons donc laisser app utiliser l'implémentation native cordova au lieu de HTML5.

0
répondu WuZhonghua 2014-05-02 00:55:18

Dans ce fil sont beaucoup de bonnes réponses, merci à tout le monde. Je voudrais ajouter ma solution en cas sb rencontre le même.

quand J'ai lancé mon application Cordova 3.5 sur mon Nexus, le service GPS n'a pas commencé après cette ligne:

navigator.geolocation.watchPosition(...);

a la place, j'ai eu ce message:

07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation

je suis confus car il n'y a pas de Java Geolocation.java fichier malgré une installation correcte du plugin.

quand il est devenu clair par le réponse de Natsu que L'équipe de Cordova a décidé d'invoquer le maternelle objet navigateur, j'ai commenté le plugin de géolocalisation dans le cordova_plugins.js:

...
{
    "file": "plugins/org.apache.cordova.geolocation/www/Position.js",
    "id": "org.apache.cordova.geolocation.Position",
    "clobbers": [
        "Position"
    ]
} 
/*----
,
{
    "file": "plugins/org.apache.cordova.geolocation/www/geolocation.js",
    "id": "org.apache.cordova.geolocation.geolocation",
    "clobbers": [
        "navigator.geolocation"
    ]
}  
----*/
,
{
    "file": "plugins/org.apache.cordova.splashscreen/www/splashscreen.js",
    "id": "org.apache.cordova.splashscreen.SplashScreen",
    "clobbers": [
        "navigator.splashscreen"
    ]
},
...

Le reste de l'installation du plugin est resté inchangé. Comme ceci, L'objet original Chrome ne se fait pas saboter et tout fonctionne très bien.

je suis maintenant un peu incertain pourquoi l'installateur de plugin ajoute l'entrée JSON bien qu'elle conduise à un dysfonctionnement. Je pense que c'est juste un peu conception faiblesse qui ne peut pas être corrigée en ce moment (...ou je devrais creuser beaucoup plus profondément dans l'installation du plugin).

modifier: Ne pas oublier de décommenter les métadonnées:

// "org.apache.cordova.geolocation": "0.3.8",
...
0
répondu peter_the_oak 2017-05-23 12:00:14

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
répondu Yuri Giovani 2014-09-24 16:40:00

ajout de la permission ci-dessous dans le fichier manifeste résolu mon problème

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
0
répondu Maurice 2014-10-08 00:34:57

Eu le même problème avec https://github.com/apache/cordova-plugin-geolocation. Résolu par la modification de cette configuration

{ enableHighAccuracy: true }

sur getCurrentPosition() et de tournage " sur le gps pour genymotion.

0
répondu OmmyJay 2018-02-08 18:14:47