Ich habe Probleme, Geolocation in Android sowohl im Emulator (auch wenn ich über Telnet geo fix
) als auch auf dem Gerät funktioniert. Funktioniert auf iOS, WP8 und im Browser.
Wenn ich das Gerät mit dem folgenden Code nach dem Ort frage, erhalte ich immer einen Fehler (in meinem Fall benutzerdefiniert Retrieving your position failed for unknown reason.
mit null
sowohl Fehlercode als auch Fehlermeldung).
Zugehöriger Code:
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)
plattformen/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 (nur für den Fall)
<feature name="Geolocation">
<param name="Android-package" value="org.Apache.cordova.GeoBroker" />
</feature>
Verwenden von Cordova 3.1.0. Testen auf Android 4.2. Plugin installiert In index.html enthaltene Cordova.js (andere Plugins wie InAppBrowser funktionieren problemlos).
$ 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' ]
Ich habe keine Ahnung. Fehlt mir etwas?
Versuchen Sie Optionen auf diese Weise, um zu sehen, ob es für Sie genauso funktioniert wie für mich:
var options = { enableHighAccuracy: true };
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
Meine Lösung bestand darin, die native HTML5-Geolocation-Unterstützung für Android/Samsung zu verwenden, falls vorhanden:
// 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}
);
Für alle Samsung-Geräte, mit denen ich getestet habe, musste enableHighAccuracy "true" sein, damit dies funktioniert. Bei Nicht-Samsung-Geräten wie dem Nexus 7 kann enableHighAccuracy ebenfalls auf 'false' gesetzt werden.
Versuche dies,
Löschen Sie das Geolocation-Plugin
cordova plugin rm org.Apache.cordova.geolocation
Stellen Sie jedoch sicher, dass die Eigenschaften AndroidManifest.xml und config.xml unverändert bleiben
(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" />
Und für iOS in config.xml
<feature name="Geolocation">
<param name="ios-package" value="CDVLocation" />
</feature>
Erstellen Sie dann die Anwendung mit CLI und führen Sie die Anwendung auf dem Gerät/Emulator aus. Sie würden feststellen, dass Sie jetzt den Fehlercode sowie die Meldung onError für getlocation erhalten.
MORE INFO: Auch nachdem Sie die oben genannten Schritte ausgeführt haben, erhalten Sie möglicherweise die Timeout-Meldung auch nach der Einstellung von {timeout:10000}
. Die Lösung dafür ist ziemlich witzig. Schalten Sie einfach Ihr Gerät aus, schalten Sie es ein und starten Sie die Anwendung erneut. Sie sollten überrascht sein zu sehen, dass das funktioniert, genau wie ich!
Mit Phonegap und Genymotion wurde der successHandler nie aufgerufen, als ich getCurrentPosition versuchte. Optionen hinzufügen:
{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0}
reparierte das für mich.
Laut https://issues.Apache.org/jira/browse/CB-5977 wurde die Unterstützung für Android-Plugins entfernt . Yi Ming Kuan sagte: "Der Grund, warum wir mit CB-5977 gegangen sind, ist, dass die Bei neueren Android-Versionen erhält webview schneller GPS-Sperren als die native API, daher wird es entfernt. Wenn Sie das Plugin unter Android hinzufügen, werden lediglich die erforderlichen Berechtigungen für die Verwendung von HTML5-Geolocation in Ihrer App hinzugefügt. "
diese Zeile löschen
<preference name="permissions" value="none"/>
stellen Sie sicher, dass sich alle <uses-permission...>
-Zeilen und die <uses-sdk...>
-Zeile vor dem <application...>
-Tag befinden.
danach deinstallieren Sie die Anwendung manuell auf dem Telefon und installieren Sie sie erneut.
hoffentlich hilft das.
lg
fastrde
Ich denke, dass Sie das Plugin manuell hinzufügen. Verwenden Sie den Befehl: (nur wenn Sie CLI-Build verwenden)
phonegap local plugin add https://git-wip-us.Apache.org/repos/asf/cordova-plugin-geolocation.git
durch das Hinzufügen der folgenden Berechtigung in der Manifestdatei wurde mein Problem behoben
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
Wenn der Fehlercode 3 war, vergewissern Sie sich, dass der Ort in den Einstellungen aktiviert ist.
Es gibt Probleme mit den neuesten Versionen von cordova-plugin-geolocation. Versuchen Sie es unter Version
<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
Ich habe das gleiche Problem mit dir, aber endlich habe ich es gelöst.
Der Grund für dieses Problem ist, dass wir immer die Funktion navigator.geolocation.getCurrentPosition des Browsers verwenden, um die Position zu lokalisieren. Daher muss App die native Implementierung von cordova anstelle von html5 verwenden.
In diesem Thread gibt es viele gute Antworten, vielen Dank an alle. Ich möchte meine Lösung für den Fall hinzufügen, dass jdm dasselbe begegnet.
Als ich meine Cordova 3.5-App auf meinem Nexus startete, wurde der GPS-Dienst nach dieser Zeile nicht gestartet:
navigator.geolocation.watchPosition(...);
Stattdessen habe ich diese Nachricht erhalten:
07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation
Ich war verwirrt, weil es kein Java Geolocation.Java
Datei trotz korrekter Installation des Plugins.
Als durch die Antwort von Nats klar wurde, dass das Cordova-Team beschlossen hat, das native Browserobjekt aufzurufen, habe ich das auskommentiert Geolocation Plugin im 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"
]
},
...
Der Rest der Plugin-Installation blieb unverändert. Auf diese Weise wird das ursprüngliche Objekt Chrome nicht blockiert und alles funktioniert einwandfrei.
Ich bin mir jetzt ein bisschen unsicher, warum das Plugin-Installationsprogramm den JSON-Eintrag hinzufügt, obwohl dies zu Fehlfunktionen führen wird. Ich denke, es ist nur eine kleine Designschwäche, die momentan nicht behoben werden kann (... oder ich sollte mich viel tiefer mit der Plugin-Installation befassen).
EDIT: Nicht zu vergessen, die Metadaten zu kommentieren:
// "org.Apache.cordova.geolocation": "0.3.8",
...