webentwicklung-frage-antwort-db.com.de

Phonegap/Cordova-Geolocation funktioniert nicht auf Android

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?

20
Kreeki

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);
15
ASP Force

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.

6
henryfi

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!

6
Dipin Krishnan

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.

5
Maxirus

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. "

3
romgar
  • Überprüfen Sie Ihre config.xml-Datei (en).

diese Zeile löschen 

<preference name="permissions" value="none"/>
  • schauen Sie in Ihre AndroidManifest.xml

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

2
fastr.de

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
1

durch das Hinzufügen der folgenden Berechtigung in der Manifestdatei wurde mein Problem behoben

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

Wenn der Fehlercode 3 war, vergewissern Sie sich, dass der Ort in den Einstellungen aktiviert ist.

0
Yuri Giovani

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" />
0

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.

0
WuZhonghua

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",
...
0
peter_the_oak