2014-04-30 17 views
13

Używam Cordova v3.4.1 do budowania aplikacji na Androida i iOS, na ios funkcja geolokacji powraca bardzo szybko i działa dobrze zawsze, ale na Androidzie, czasami nie działa.Geolokalizacja Phonegap czasami nie działa na Androidzie

Dziwne jest to, że po ponownym uruchomieniu telefonu z Androidem, działa dobrze. W ciągu kilku godzin geolokalizacja uzyskuje bardzo szybko pozycję zarówno w sieciach Wi-Fi, jak i 3G.

Ale po godzinach pracy ponownie otwieram aplikację, geolokalizacja nie działa. Czasami, gdy jestem na zewnątrz, może uzyskać pozycję z satelitą GPS, ale bardzo wolno, często występuje błąd przekroczenia limitu czasu.

Próbuję usunąć aplikację i ponownie ją zainstalować, ale problem nadal istnieje, chyba że ponownie uruchomię mój telefon z Androidem. Po ponownym uruchomieniu telefonu z Androidem funkcja geolokalizacji znowu działa poprawnie w przyszłości za kilka godzin.

Posiadam telefon komórkowy z serwalem, taki jak samsang note2, galaxy4 itd. Wszystkie mają ten sam problem. Gdy zrestartuję komputer, mogą uzyskać bardzo szybką lokalizację.

Ten problem mnie martwi od dłuższego czasu, więc ktoś mi pomoże?

tutaj jest mój kod poniżej:

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

mój config.xml:

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

Odpowiedz

15

Wreszcie mam rozwiązać ten problem, teraz na mój telefon android, getCurrentPosition funkcja lokalizacja powrót infomation bardzo szybko każdy czas, nigdy nie muszę ponownie uruchamiać mojego telefonu! Nie jestem pewien, czy plugin geo void 4.13 ma błędy.

Powodem wystąpienia tego problemu jest zawsze użycie funkcji przeglądarki w celu znalezienia pozycji, dlatego musimy pozwolić aplikacji na używanie natywnej implementacji cordova zamiast html5.

Oto rozwiązanie z cordova v3.4.1, mam nadzieję, że może ci pomóc, w rzeczywistości rozwiązało moje pytanie.

rozwiązać krok:

1.remove na org.apache.cordova.geolocation

$ cordova plugin rm org.apache.cordova.geolocation 

2.reinstall nowy plugin org.apache.cordova.geolocation

$ cordova plugin add org.apache.cordova.geolocation 

3 . Kopiuj wtyczkę do e: \

wprowadź folder wtyczek, taki jak 'YOUR_APP_FOLDER \ plugins \'

skopiować otwór org.apache.cordova.geolocation do E:\org.apache.cordova.geolocation

4.remove wtyczki ponownie

$ cordova plugin rm org.apache.cordova.geolocation 

5.Edit plugin.xml w E:\org.apache.cordova.geolocation\plugin.xml

edycja wtyczki.plik xml jak poniżej:

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

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

7, uruchom build commond

$ cordova build android 

8.check jeśli to działa dobrze

check YOUR_APP\plugins\android.json koniecznością obejmują:

{ 
    "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 musi zawierać:

<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 musi zawierać:

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

9.run aplikacja

napisać kod geelocation zdobycia lat i 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 

});

Jeśli twoja obsługa telefoniczna korzysta z lokalizacji Wi-Fi/3G, natychmiast otrzymamy lokalizację, w przeciwnym razie zobaczysz errMsg timeout, a następnie geolocation użyje gps do zlokalizowania stanowiska z natywnym narzędziem.

teraz dostajemy lat i lng, i nigdy nie trzeba restartować telefonu Android, dziękuję za dobroć.

jeśli problem nadal występuje, spróbuj wyczyścić pamięć podręczną Webview zainstalować wtyczkę:

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

+0

Ten problem jest wciąż żywy na PG 3.5, a Twoje rozwiązanie wciąż działa! – rodripf

+1

Czy nadal musimy to wszystko robić w PG 5.1.1? Przez większość czasu navigator.geolocation.getCurrentPosition() nie działa na moim urządzeniu z systemem Android.Ponowne uruchomienie również nie pomaga. – novalain

+0

Tak, nadal muszę ... –

0

na Cordova v5.3.3, trzeba to zrobić:

1, Kordowa wtyczka usuń Cordova-plugin-geolokalizacja

2, Kordowa plugin dodać Cordova-plugin-geolokalizacja

3, skopiuj swój przewód komórki jajowe-plugin-geolokalizacja katalog w swoim plguins dir do E: \

4 edycji plugin.xml, dodać to:

<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 Cordova usunąć plugin-plugin-geolokalizacji

6, Kordowa plugin dodać e: \ Cordova-plugin-geolokalizacja

7, Kordowa uruchomić android teraz, mam gp dobrze pozycji. dziękuję za WuZhonghua.

+0

Mam cordova 5.4.1 na mac. Zrobiłem zmiany, które opisałeś, ale metoda onSuccess lub onError nigdy nie jest wywoływana, gdy wysyłam navigator.geolocation.getCurrentPosition (onSuccess, onError); Dowolny pomysł ? – Luc

+0

@ Luc używając tego 'value =" org.apache.cordova.geolocation.GeoBroker "' zamiast "value =" org.apache.cordova.geolocation.Geolocation' łamie również dla mnie getCurrentPosition. – FuzzyTree

Powiązane problemy