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?
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);
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!
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'.
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.
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."
- 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
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
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.
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",
...
si le code d'erreur était 3, vérifiez si l'emplacement dans les paramètres est activé. C'est un travail pour moi.
ajout de la permission ci-dessous dans le fichier manifeste résolu mon problème
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
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.