2013-10-21 132 views
17

我在使用模擬器(即使當我通過telnet連接到geo fix時)和設備上的Geoocation在Android上工作時遇到了麻煩。適用於iOS,WP8和瀏覽器。Phonegap /科爾多瓦地理位置不能在Android上工作

當我使用下面的代碼詢問設備的位置時,我總是得到一個錯誤(在我的情況下,自定義Retrieving your position failed for unknown reason.null錯誤代碼和錯誤消息)。

相關代碼:

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) 

平臺/安卓/ 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文件(以防萬一)

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

使用科爾多瓦3.1.0 。在Android 4.2上測試。插件已安裝。包含在index.html中的Cordova.js(InAppBrowser等其他插件工作正常)。

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

我很無能。我錯過了什麼嗎?

+0

您是否使用CLI構建您的項目? –

+0

CLI和Phonegap構建。我已經構建了一個簡單的應用程序,其中地理工作,所以今天我會比較什麼是不同的,並更新問題。 – Kreeki

+0

Kreeki有關於此問題的更多更新?你有沒有比較你的構建? – jguffey

回答

1

我想你是手動添加插件。使用命令:(嚴格的,如果你正在使用CLI編譯)

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

謝謝,這是非常有用的工作,就像你說的 – 2014-02-06 07:57:32

2
  • 檢查config.xml文件(S)。

刪除這一行

<preference name="permissions" value="none"/> 
  • 凝視你的AndroidManifest.xml

檢查所有<uses-permission...>線和<uses-sdk...>線的<application...>標記之前的位置。

之後,在手機上手動卸載應用程序並重新安裝。

希望有幫助。

LG

fastrde

+0

謝謝,很好的思考與權限。我試過但沒有幫助。 – Kreeki

6

試試這個,

刪除地理位置插件

cordova plugin rm org.apache.cordova.geolocation 

然而,確保AndroidManifest.xml中和config.xml的性質仍然是這樣

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

而爲iOS config.xml中

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

然後,使用CLI生成應用程序和運行在設備/仿真器應用程序。你會發現你現在得到錯誤代碼以及getlocation的onError消息。

更多信息:即使在執行上述步驟之後,即使在設置{timeout:10000}後,仍可能會一直收到超時消息。解決方案非常有趣,只需關閉設備並打開它並再次運行應用程序即可。你應該感到驚訝,看到工作,就像我一樣!

+0

「只需關閉您的設備,並打開它並再次運行該應用程序。」 我的上帝....只是這對我來說我認爲.. Ty –

15

嘗試選擇這種方式,看看它是否適合你,因爲它有對我來說:

var options = { enableHighAccuracy: true }; 

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

這個修復了我的問題,在工具欄中啓用了帶有GPS功能的Genymotion。 – Blaise

+0

這個解決方案適用於kony工作室以及(: – aemonge

6

我的解決辦法是使用的Android /三星原生HTML5地理定位的支持,如果它存在:

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

對於我測試過的所有三星設備,enableHighAccuracy必須是「真實的」才能使用。對於諸如Nexus 7之類的非三星設備,enableHighAccuracy也可以設置爲'false'。

+0

嗨,你的方法是創新的,但請檢查:[http://stackoverflow.com/questions/ 19491875/PhoneGap的 - 科爾多瓦 - 地理位置 - 不工作-上的Android/245321252#4532125(http://stackoverflow.com/questions/19491875/phonegap-cordova-geolocatio正不-勞動上的Android/24532125#24532125)。它可以爲你節省一些工作。竅門是不允許插件機制第一次打破'navigator.geolocation'。 –

0

我和你有同樣的問題,但最後我解決了它。

發生此問題的原因是我們總是使用瀏覽器的navigator.geolocation.getCurrentPosition函數來定位位置,因此我們必須讓應用程序使用cordova本機實現而不是html5。

3

根據https://issues.apache.org/jira/browse/CB-5977,Android插件支持已被刪除。 Yi Ming Kuan說:「我們之所以選擇CB-5977,是因爲新版Android版本的webview會比原生API更快地獲得GPS鎖定,因此將其刪除。在Android上添加插件只需添加必要的權限即可使用HTML5您應用中的地理位置。「

+0

這個解釋對我幫助很大,thx。所以我可以確保沒有其他事情干擾瀏覽器的本地工作。 –

0

在這個線程是很多很好的答案,thx給大家。如果遇到同樣的情況,我想添加我的解決方案。

當我啓動了我的Nexus我的科爾多瓦3.5的應用程序,在GPS服務沒有這一行後開始:

navigator.geolocation.watchPosition(...);

相反,我得到這個消息:

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

我很困惑,因爲儘管安裝了正確的插件,但根本沒有Java Geolocation.java文件。

當由answer of Natsu的科爾多瓦團隊決定調用本地瀏覽器對象有明確的,我在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" 
    ] 
}, 
... 

插件安裝的其餘部分保持不變。像這樣,原始的Chrome對象不會被破壞,一切正常。

我現在有點不確定爲什麼插件安裝程序添加JSON條目,雖然它會導致故障。我想這只是一個現在無法糾正的小設計弱點(...或者我應該更深入地瞭解插件安裝)。

編輯: 不要忘記取消對元數據:

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

我在iPhone上使用插件「org.apache.cordova.geolocation」:「0.3.9」。它仍然不起作用。新版本可能沒有修復這個大錯誤嗎? – DeLac

+0

navigator.geolocation.getCurrentPosition起作用。 – DeLac

4

使用的PhoneGap和Genymotion的successHandler從來沒有被當我試圖getCurrentPosition調用。添加選項:

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

爲我解決了這個問題。

0

如果錯誤代碼爲3,請驗證設置中的位置是否已啓用。 這是我的工作。

0

添加清單文件,下面的權限解決了我的問題

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
相關問題