2014-04-30 25 views
13

Ich habe Cordova v3.4.1 zu bauen Android und iOS-App, auf iOS Geolocation-Funktion ist sehr schnell und funktioniert immer gut, aber auf Android, manchmal funktioniert es nicht.Phonegap Geolocation manchmal nicht auf Android

Die seltsame Sache ist, nachdem ich mein Android-Handy neu starten, funktioniert es gut. In mehr als ein paar Stunden bekommt Geolocation die Position sehr schnell sowohl in Wi-Fi und 3G.

Aber nach Serval Stunden, öffne ich die App wieder, die Geolocation kann nicht funktionieren.Manchmal, wenn ich draußen, kann es Position mit GPS-Satelliten, aber sehr langsam, oft auftreten, Timeout-Fehler.

Ich versuche, die App zu entfernen und erneut zu installieren, aber das Problem besteht immer noch, wenn ich mein Android-Handy neu starten.Wenn ich mein Android-Handy neu starten, funktioniert die Geolocation-Funktion in Zukunft wieder ein paar Stunden.

Ich habe test serval android `s Telefon wie Samsang note2, galaxy4 etc, sie haben alle das gleiche Problem.Wenn ich es neu starte, können sie Lage sehr quicly bekommen.

Dieses Problem hat mich für eine lange Zeit beunruhigt, also hilft mir jemand?

hier ist mein Code unten:

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 
}); 

mein config.xml:

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

Antwort

15

Schließlich habe ich das Problem lösen, jetzt auf meinem Android-Handy, getCurrentPosition Funktion Infomationen Rückkehrort sehr schnell alle Zeit, ich brauche nie wieder mein Telefon neu zu starten! Ich bin mir nicht sicher, ob das geoloation Plugin von cordova v3.4.1 Bugs hat.

Der Grund dieses Problem auftritt ist, dass wir immer Browsers verwenden navigator.geolocation.getCurrentPosition Funktion der Postion zu lokalisieren, also müssen wir app Verwendung cordova native Implementierung statt html5 lassen.

Hier ist die Lösung mit Cordova v3.4.1, hoffe, es kann Ihnen helfen, in der Tat hat es meine Frage gelöst.

lösen Schritt:

1.remove die org.apache.cordova.geolocation

$ cordova plugin rm org.apache.cordova.geolocation 

2.reinstall eine neue org.apache.cordova.geolocation Plugin

$ cordova plugin add org.apache.cordova.geolocation 

3 Kopieren Sie das Plugin zu e: \

Geben Sie den Plugin-Ordner ein, z. B. 'YOUR_APP_FOLDER \ plugins \'

kopieren Sie das Loch org.apache.cordova.geolocation-E:\org.apache.cordova.geolocation

4.Remove das Plugin wieder

$ cordova plugin rm org.apache.cordova.geolocation 

5.Bearbeiten die plugin.xml in E:\org.apache.cordova.geolocation\plugin.xml

bearbeiten das Plugin.XML-Datei wie folgt:

... ... 
<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 wieder Plugin

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

7, laufen build commond

$ cordova build android 

8.Achten Sie darauf, wenn es

Scheck YOUR_APP\plugins\android.json muss gut funktionieren enthalten:

{ 
    "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 muss Folgendes enthalten:

<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 muss Folgendes enthalten:

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

9.run die App

den geelocation Code schreiben lat und lng zu erhalten:

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 

});

Wenn Ihr Telefon Unterstützung verwenden wifi/3G suchen, dann werden wir sofort Standort erhalten, sonst sehen Sie die errMsg timeout und dann geolocation wird GPS verwenden, um Position mit nativen Gerät zu lokalisieren.

jetzt bekommen wir die lat und lng, und brauchen nie das android phone agian neu starten, zum glück.

, wenn Sie immer noch das Problem haben, versuchen Sie das Plugin zu installieren, um die Webansicht Cache zu reinigen:

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

+0

Dieses Problem ist immer noch auf PG 3.5 und Ihre Lösung funktioniert immer noch! – rodripf

+1

Müssen wir das alles noch in PG 5.1.1 machen? Meistens funktioniert die navigator.geolocation.getCurrentPosition() überhaupt nicht auf meinem Android-Gerät.Ein Neustart hilft auch nicht. – novalain

+0

Ja, muss noch tun ... –

0

auf cordova v5.3.3, müssen Sie dies tun:

1, cordova Plugin entfernen cordova-plugin-Geolocation

2, cordova Plugin cordova-Plugin-Geolocation

3, kopieren Sie Ihre Schnur hinzufügen Eizellen-plugin-Geolocation-Verzeichnis in Ihrem plguins dir zu e: \

4, bearbeiten plugin.xml, fügen Sie diese:

<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, cordova Plugin entfernen cordova-plugin-Geolokalisierung

6, cordova Plugin hinzufügen e: \ cordova-Plugin-Geolocation

7, Córdova android laufen jetzt habe ich gp s Position gut. Danke für WuZhonghua.

+0

Ich habe Cordova 5.4.1 auf einem Mac. Ich habe die von Ihnen beschriebenen Änderungen vorgenommen, aber die Methode onSuccess oder onError wird nie aufgerufen, wenn ich navigator.geolocation.getCurrentPosition (onSuccess, onError) ausgabe; Irgendeine Idee ? – Luc

+0

@Luc mit diesem 'value =" org.apache.cordova.geolocation.GeoBroker "' anstelle von 'value =" org.apache.cordova.geolocation.Geolocation' bricht auch getCurrentPosition für mich ab. Hast du es herausgefunden? – FuzzyTree

Verwandte Themen