2014-04-30 20 views
13

Ho usato cordova v3.4.1 per costruire app per Android e iOS, su ios la funzione di geolocalizzazione sta tornando molto velocemente e funziona sempre bene, ma su Android, a volte non funziona.La geolocalizzazione di PhoneGap a volte non funziona su Android

La cosa strana è dopo aver riavviato il mio telefono Android, funziona bene. In più di poche ore la geolocalizzazione ottiene la posizione molto rapidamente sia in wifi che in 3G.

Ma dopo ore Serval, apro l'applicazione di nuovo, la geolocalizzazione non può work.Sometimes quando al di fuori, si può ottenere postion con gps satellitare, ma molto lento, spesso si verificano errore di timeout.

Cerco di rimuovere l'app e reinstallarlo di nuovo, ma il problema esiste ancora, a meno di riavviare il mio telefono android.quando riavvio il mio telefono Android, la funzione di geolocalizzazione funziona ancora bene in futuro poche ore.

Ho il telefono di prova di Android come samsang note2, galaxy4, ecc., Hanno tutti lo stesso problema. Quando lo riavvio, possono ottenere la posizione in modo molto preciso.

Questo problema mi ha turbato a lungo, quindi qualcuno mi può aiutare?

qui è il mio codice qui sotto:

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

mia config.xml:

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

risposta

15

Finalmente ho risolto il problema, ora sul mio telefono Android, getCurrentPosition funzione di posizione di ritorno infomation molto rapidamente ogni volta, non ho mai bisogno di riavviare di nuovo il mio telefono! Non sono sicuro che il plug-in di geolocalizzazione di cordova v3.4.1 abbia dei bug.

La ragione per cui si verifica questo problema è che dobbiamo sempre utilizzare la funzione del browser navigator.geolocation.getCurrentPosition per individuare la posizione, quindi è necessario consentire all'applicazione di utilizzare l'implementazione nativa cordova anziché html5.

Ecco la soluzione con cordova v3.4.1, spero che possa aiutarti, infatti ha risolto la mia domanda.

risolvere passo:

1.Remove l'org.apache.cordova.geolocation

$ cordova plugin rm org.apache.cordova.geolocation 

2.reinstall un nuovo plugin org.apache.cordova.geolocation

$ cordova plugin add org.apache.cordova.geolocation 

3 Copia il plug-in su e: \

inserisci la cartella del plug-in, ad esempio "YOUR_APP_FOLDER \ plugins \ '

copiare il foro org.apache.cordova.geolocation-E:\org.apache.cordova.geolocation

4.Rimuovere il plugin di nuovo

$ cordova plugin rm org.apache.cordova.geolocation 

5.edit il plugin.xml in E:\org.apache.cordova.geolocation\plugin.xml

modificare il plugin.file XML come di seguito:

... ... 
<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 di nuovo

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

7, eseguire accumulo commond

$ cordova build android 

8.Controllare se funziona bene

controllo YOUR_APP\plugins\android.json must include:

{ 
    "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 
} 

controllo YOUR_APP\platforms\android\AndroidManifest.xml deve contenere:

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

controllo YOUR_APP\platforms\android\res\xml\config.xml devono comprendere:

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

9.run l'applicazione

scrivere il codice per ottenere geelocation lat e 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 

});

se il supporto telefonico usa wifi/3G locate, otterremo immediatamente la posizione, altrimenti vedrete il errMsg timeout e quindi geolocation utilizzeremo gps per localizzare postion con lo strumento nativo.

ora otteniamo lat e lng e non è mai necessario riavviare il telefono Android, grazie al cielo.

se avete ancora il problema, tentare di installare il plugin per pulire la cache WebView:

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

+0

Questo problema è ancora attivo su PG 3.5 e la soluzione funziona ancora! – rodripf

+1

Abbiamo ancora bisogno di fare tutto questo in PG 5.1.1? Il più delle volte il navigator.geolocation.getCurrentPosition() non funziona affatto sul mio dispositivo Android.Riavviarlo non aiuta neanche. – novalain

+0

Sì, c'è ancora bisogno di fare ... –

0

su Cordova v5.3.3, è necessario fare questo:

1, Cordova plugin di rimuovere Cordova-plugin-geolocalizzazione

2, Cordova plug aggiungere cordova-plugin-geolocalizzazione

3, copiare il cavo ovuli-plugin-geolocalizzazione directory nei vostri plguins dir E: \

4, modificare plugin.xml, aggiungere questo:

<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 plug rimuovere cordova-plugin-geolocalizzazione

6, Cordova plugin di aggiungere e: \ Cordova-plugin-geolocalizzazione

7, Cordova eseguire Android ora, ho ottenuto gp la posizione di s bene. grazie per WuZhonghua.

+0

Ho cordova 5.4.1 su un mac. Ho fatto le modifiche che hai descritto ma i metodi onSuccess o onError non vengono mai chiamati quando rilascio navigator.geolocation.getCurrentPosition (onSuccess, onError); Qualche idea ? – Luc

+0

@Luc utilizzare questo 'value = "org.apache.cordova.geolocation.GeoBroker"' invece di 'value =" org.apache.cordova.geolocation.Geolocation' rompe getCurrentPosition anche per me. Hai capirlo? – FuzzyTree

Problemi correlati