web-dev-qa-db-fra.com

La géolocalisation Phonegap ne fonctionne parfois pas sur Android

J'ai utilisé cordova v3.4.1 pour créer une application Android et ios. La fonction de géolocalisation d'ios revient très rapidement et fonctionne parfaitement, mais sous Android, elle ne fonctionne parfois pas.

La chose étrange est après le redémarrage de mon téléphone Android, cela fonctionne bien. En plus de quelques heures, la géolocalisation prend très rapidement la position à la fois en wifi et en 3G.

Mais après des heures de service, j’ouvre à nouveau l’application, la géolocalisation ne peut pas fonctionner. Parfois, lorsque je suis à l’extérieur, il peut se positionner avec le satellite gps, mais très lentement, une erreur de temporisation se produit souvent.

J'essaie de supprimer l'application et de la réinstaller à nouveau, mais le problème persiste, à moins de redémarrer mon téléphone Android. Lorsque je redémarre mon téléphone Android, la fonction de géolocalisation fonctionne à nouveau dans quelques heures.

J'ai des téléphones de test Serval Android tels que samsang note2, galaxy4 etc., ils ont tous le même problème. Quand je le redémarre, ils peuvent obtenir très rapidement l'emplacement.

Ce problème me préoccupe depuis longtemps, alors quelqu'un m'aide?

voici mon code ci-dessous:

navigator.geolocation.getCurrentPosition(function(pos){
                cb(null,pos)
            },function(errMsg){
    navigator.geolocation.getCurrentPosition(function(pos){  
            cb(null,pos)
    },function(errMsg){
    cb(errMsg)
    }, {
    enableHighAccuracy: true,
    timeout: 60*1000*2,
    maximumAge: 1000*60*10
   });
}, {
    enableHighAccuracy: false,
    timeout: 10*1000,
    maximumAge: 1000*60*10
});

mon config.xml:

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

Enfin, j’ai résolu le problème, maintenant sur mon téléphone Android, la fonction getCurrentPosition informations de localisation de retour est renvoyée très rapidement à chaque fois, je n’ai plus besoin de redémarrer mon téléphone! .

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.

Voici la solution avec Cordova v3.4.1. J'espère que cela pourra vous aider. En fait, cela a résolu ma question.

résoudre l'étape:

1.remove org.Apache.cordova.geolocation

$ cordova plugin rm org.Apache.cordova.geolocation

2.reinstaller un nouveau plugin org.Apache.cordova.geolocation

$ cordova plugin add org.Apache.cordova.geolocation

3.copiez le plugin dans e: \

entrez le dossier du plugin, tel que "YOUR_APP_FOLDER\plugins \"

copier le trou org.Apache.cordova.geolocation dans E:\org.Apache.cordova.geolocation

4.remove le plugin à nouveau

$ cordova plugin rm org.Apache.cordova.geolocation

5.éditez le plugin.xml dans E:\org.Apache.cordova.geolocation\plugin.xml

éditez le fichier plugin.xml comme ci-dessous:

... ...
<name>Geolocation</name>
<description>Cordova Geolocation Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,geolocation</keywords>
<repo>https://git-wip-us.Apache.org/repos/asf/cordova-plugin-geolocation.git</repo>
<issue>https://issues.Apache.org/jira/browse/CB/component/12320638</issue>

<!-- Android Code Comments
<platform name="Android">

    <config-file target="AndroidManifest.xml" parent="/*">
        <uses-permissionandroid 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" />
    </config-file>

</platform>
-->

 <!-- Amazon-fireos change to Android-->
<platform name="Android"> 

    <js-module src="www/Coordinates.js" name="Coordinates">
        <clobbers target="Coordinates" />
    </js-module>

    <js-module src="www/PositionError.js" name="PositionError">
        <clobbers target="PositionError" />
    </js-module>

    <js-module src="www/Position.js" name="Position">
        <clobbers target="Position" />
    </js-module>

    <js-module src="www/geolocation.js" name="geolocation">
        <clobbers target="navigator.geolocation" />
    </js-module>

    <config-file target="res/xml/config.xml" parent="/*">
        <feature name="Geolocation">
            <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker"/>
        </feature>
    </config-file>

    <config-file target="AndroidManifest.xml" parent="/*">
        <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" />
    </config-file>

    <source-file src="src/Amazon/GeoBroker.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/GPSListener.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/NetworkListener.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/CordovaLocationListener.Java" target-dir="src/org/Apache/cordova/geolocation" />

</platform>

<!-- ios -->
<platform name="ios">
... ...

6.add plugin encore

$ cordova plugin add E:\org.Apache.cordova.geolocation

7 run build commond

$ cordova build Android

8.check si cela fonctionne bien

check YOUR_APP\plugins\Android.json doit inclure:

{
   "xml": "<feature name=\"Geolocation\"><param name=\"Android-package\" value=\"org.Apache.cordova.geolocation.GeoBroker\" /></feature>",
   "count": 1
},
... ...
{
  "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_COARSE_LOCATION\" />",
  "count": 4
},
{
   "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_FINE_LOCATION\" />",
    "count": 4
},
{
  "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\" />",
  "count": 1
 }

check YOUR_APP\platforms\Android\AndroidManifest.xml doit inclure:

<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_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

check YOUR_APP\platforms\Android\res\xml\config.xml doit inclure:

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

9. exécuter l'application

écrivez le code de localisation pour obtenir les lat et lng:

navigator.geolocation.getCurrentPosition(function(pos){
            alert('suc')
            alert(JSON.stringify(pos))
        },function(errMsg){
               alert(JSON.stringify(errMsg))
               navigator.geolocation.getCurrentPosition(function(pos){  
                 alert('suc')
                 alert(JSON.stringify(pos))
               },function(errMsg){
                 alert(JSON.stringify(errMsg))
               }, {
               enableHighAccuracy: true,
               timeout: 60*1000*2,
               maximumAge: 1000*60*10
               });
          }, {
enableHighAccuracy: false,
timeout: 60*1000,
maximumAge: 1000*60*10

});

si votre support téléphonique utilise wifi/3G Locate, nous aurons l'emplacement immédiatement. Sinon, vous verrez le errMsg timeout, puis geolocation utilisera le GPS pour localiser la position avec une implémentation native.

maintenant, nous avons le lat et le lng, et nous n'avons jamais besoin de redémarrer le téléphone Android, mais, Dieu merci.

si le problème persiste, essayez d'installer le plug-in pour nettoyer le cache Webview:

https://github.com/moderna/cordova-plugin-cache

16
WuZhonghua

sur cordova v5.3.3, vous devez le faire:

1 plugin cordova supprimer cordova-plugin-geolocation

2 plugin cordova ajouter cordova-plugin-geolocation

3 、 copiez votre répertoire cordova-plugin-geolocation dans votre répertoire plguins vers e: \

4 、 modifier plugin.xml, ajoutez ceci:

<js-module src="www/Coordinates.js" name="Coordinates">
    <clobbers target="Coordinates" />
</js-module>

<js-module src="www/PositionError.js" name="PositionError">
    <clobbers target="PositionError" />
</js-module>

<js-module src="www/Position.js" name="Position">
    <clobbers target="Position" />
</js-module>

<js-module src="www/geolocation.js" name="geolocation">
    <clobbers target="navigator.geolocation" />
</js-module>

<config-file target="res/xml/config.xml" parent="/*">
    <feature name="Geolocation">
        <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker"/>
    </feature>
</config-file>

<config-file target="AndroidManifest.xml" parent="/*">
    <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" />
</config-file>

5 、 plugin cordova supprimer cordova-plugin-geolocation

6 、 plugin cordova add e:\cordova-plugin-geolocation

7 、 Cordova lance Android Maintenant, j'ai bien positionné le GPS. merci pour WuZhonghua. 

0
user2147549