2013-10-21 10 views
17

Ho difficoltà a far funzionare la geolocalizzazione su Android in entrambi gli emulatori (anche quando I geo fix su telnet) e sul dispositivo. Funziona su iOS, WP8 e nel browser.La geolocalizzazione di PhoneGap/Cordova non funziona su Android

quando chiedo dispositivo per la posizione utilizzando il seguente codice, ottengo sempre un errore (nel mio caso personalizzato Retrieving your position failed for unknown reason. con null sia il codice di errore e il messaggio di errore).

codice correlate:

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) 

piattaforme/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 (solo nel caso)

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

Utilizzando Cordova 3.1.0 . Test su Android 4.2. Plugin installato. Cordova.js incluso in index.html (altri plugin come InAppBrowser funzionano correttamente).

$ 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' ] 

Sono senza tracce. Mi sto perdendo qualcosa?

+0

Hai creato il tuo progetto utilizzando la CLI? –

+0

Sia CLI che Build PhoneGap. Ho creato una semplice app in cui funziona geo, quindi oggi confronterò le differenze e aggiornerò la domanda. – Kreeki

+0

Kreeki altri aggiornamenti con questo problema? Hai avuto modo di confrontare le tue build? – jguffey

risposta

1

Penso che tu stia aggiungendo il plugin manualmente. utilizzare il comando: (rigorosamente se si utilizza CLI accumulo)

phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git 
+0

Grazie, questo è stato molto utile. Funziona come hai detto tu –

2
  • controllare il file config.xml (s).

eliminare questa linea

<preference name="permissions" value="none"/> 
  • sguardo nel tuo check AndroidManifest.xml

che tutti <uses-permission...> linee e la linea <uses-sdk...> si trovano prima del tag <application...>.

dopo aver disinstallato l'applicazione manualmente sul telefono e reinstallata.

speranza che aiuti.

lg

fastrde

+0

Grazie , buon pensiero con i permessi Ho provato ma non aiuta – Kreeki

6

Prova questo,

Eliminare il plugin geolocalizzazione

cordova plugin rm org.apache.cordova.geolocation 

Tuttavia, assicurarsi che AndroidManifest.xml e le proprietà config.xml rimane tale

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

E per iOS in config.xml

<feature name="Geolocation"> 
    <param name="ios-package" value="CDVLocation" /> 
</feature> 

Poi, costruire l'applicazione utilizzando CLI ed eseguire l'applicazione sul dispositivo/emulatore.Scoprirai che ora ricevi il codice di errore e il messaggio onError per la destinazione.

ULTERIORI INFORMAZIONI: Anche dopo aver eseguito i passaggi precedenti, è possibile ottenere il messaggio di timeout in modo coerente anche dopo aver impostato {timeout:10000}. La soluzione per questo è abbastanza divertente, basta spegnere il dispositivo, accenderlo ed eseguire nuovamente l'applicazione. Dovresti essere sorpreso di vederlo funzionare, proprio come me!

+0

"basta spegnere il dispositivo e accenderlo ed eseguire nuovamente l'applicazione." Mio Dio .... era solo questo per me penso .. Ty –

15

opzioni provare in questo modo per vedere se funziona per voi come ha fatto per me:

var options = { enableHighAccuracy: true }; 

navigator.geolocation.getCurrentPosition(onSuccess, onError, options); 
+1

Questo problema è stato risolto per me, utilizzando Genymotion con il GPS abilitato nella barra degli strumenti. – Blaise

+0

Questa soluzione funziona anche per kony studio (: – aemonge

6

La mia soluzione era quella di utilizzare il supporto nativo geolocalizzazione HTML5 per Android/Samsung se esistesse:

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

Per tutti i dispositivi Samsung con cui ho eseguito il test, enableHighAccuracy doveva essere "true" perché funzionasse. Con dispositivi non Samsung come il Nexus 7, enableHighAccuracy può essere impostato su 'false'.

+0

Ciao, il tuo approccio è innovativo, ma controlla questo: [http://stackoverflow.com/questions/ 19491875/PhoneGap-Cordova-geolocalizzazione-non-lavoro-on-android/245321252 # 4532125] (http://stackoverflow.com/questions/19491875/phonegap-cordova-geolocatio n-non-lavoro-on-android/24532125 # 24532125). Potrebbe farti risparmiare un po 'di lavoro. Il trucco non è quello di consentire al meccanismo del plugin di clobare il 'navigator.geolocation' nella prima volta. –

0

Ho lo stesso problema con voi, ma alla fine ho risolto.

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

3

In base allo standard https://issues.apache.org/jira/browse/CB-5977, il supporto del plug-in per Android è stato rimosso. Yi Ming Kuan ha dichiarato: "La ragione per cui siamo andati con CB-5977 è che il WebView sulle versioni più recenti di Android otterrà serrature GPS più rapidamente della API native, da qui la sua rimozione. Aggiungendo il plugin su Android aggiunge solo le autorizzazioni necessarie per utilizzare HTML5 Geolocalizzazione nella tua app. "

+0

Queste spiegazioni mi hanno aiutato un sacco, grazie. Quindi potevo assicurarmi che nient'altro disturbasse il lavoro nativo del browser. –

0

In questa discussione ci sono molte buone risposte, grazie a tutti. Vorrei aggiungere la mia soluzione nel caso in cui sb incontri lo stesso.

Quando ho lanciato il mio Cordova 3.5 app sul mio Nexus, il servizio GPS non è stato avviato dopo questa riga:

navigator.geolocation.watchPosition(...);

Invece, ho ricevuto questo messaggio:

07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation 

I era confuso perché non c'era alcun file Java Geolocation.java nonostante una corretta installazione del plugin.

Quando fu chiaro dalla answer of Natsu che la squadra Cordova ha deciso di richiamare il nativo oggetto del browser , ho commentato il plugin di geolocalizzazione nel 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" 
    ] 
}, 
... 

Il resto della installazione del plugin è rimasto invariato . In questo modo, l'oggetto originale di Chrome non viene danneggiato e tutto funziona correttamente.

Ora sono un po 'insicuro perché il programma di installazione del plugin aggiunge la voce JSON anche se causerà un malfunzionamento. Immagino che sia solo un po 'di debolezza del design che non può essere corretto in questo momento (... o dovrei scavare più a fondo nell'installazione dei plugin).

EDIT: non dimenticare di togliere il commento alla metadati:

// "org.apache.cordova.geolocation": "0.3.8", 
... 
+0

Sto usando il plugin "org.apache.cordova.geolocation": "0.3.9" con un iPhone. Non funziona ancora. È possibile che la nuova versione non abbia risolto questo grosso bug? – DeLac

+0

navigator.geolocation.getCurrentPosition funziona. – DeLac

4

Utilizzando PhoneGap e Genymotion, il successHandler non è mai stato chiamato quando ho cercato di getCurrentPosition. Aggiunta delle opzioni:

{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0} 

risolto per me.

0

Se il codice di errore era 3, verificare se la posizione nelle impostazioni è abilitata. Questo è lavoro per me.

0

aggiungendo il permesso di seguito nel file manifesto risolto il mio problema

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />