簡體   English   中英

android geolocation使用phonegap代碼:3錯誤

[英]android geolocation using phonegap code: 3 error

我正在嘗試使用PhoneGap API doc進行地理定位,但收到以下錯誤消息,

警報代碼:3消息:超時已過期

我的代碼是,

    <script>

// Wait for Cordova to load
//
document.addEventListener("deviceready", onDeviceReady, false);

var watchID = null;

// Cordova is ready
//
function onDeviceReady() {
    // Throw an error if no update is received every 30 seconds
    var options = { timeout: 10000 };
    watchID = navigator.geolocation.watchPosition(onSuccess, onError, options);
}

// onSuccess Geolocation
//
function onSuccess(position) {
    var element = document.getElementById('geolocation');
    element.innerHTML = 'Latitude: ' + position.coords.latitude + '<br />' +
                    'Longitude: ' + position.coords.longitude + '<br />' +
                    '<hr />' + element.innerHTML;
}

// onError Callback receives a PositionError object
//
function onError(error) {
    alert('code: ' + error.code + '\n' +
      'message: ' + error.message + '\n');
}

請告訴我我缺少的東西。

我相信這是一個相對常見的問題,特別是對於Android設備。 我遇到過的一些流行解決方案包括

  1. 不要指定錯誤callBack:由於一些非常奇怪的原因,這是有效的,如果沒有啟用GPS,你將遇到唯一的問題。 我不會在生產應用程序中建議這一點。

  2. 在選項中指定enableHighAccuracy:true。 這似乎有效,但不是單獨的,見下面的#3

  3. 在選項中指定maximumAge:我使用此選項並將其設置為非常高,可能為1小時。 它的作用是即使當前沒有GPS,cordova也會給你在過去一小時內捕獲的最后已知坐標,所以這實際上取決於你想要坐標在時間上的准確度。

我通常使用#2和#3的組合,這適用於Phonegap 3.x.

作為一方,您可以包含一個選項,通過插件在錯誤回調中啟動設備設置的插件,以便用戶可以在禁用時啟用GPS(就像手機上的谷歌地圖一樣,當您使用它進行導航時)。

我希望這有幫助。

假設您在Android模擬器中遇到此問題:

  1. 添加超時並設置enableHighAccuracy:

     navigator.geolocation.getCurrentPosition(onSuccess, onError, {timeout: 10000, enableHighAccuracy: true}); 

    在某些模擬器中,您需要將enableHighAccuracy設置為false,因此如果仍然不起作用請嘗試。

  2. 在Android中,模擬器不讀取GPS值,因此我們需要通過命令行發送它們。 我們需要在運行模擬器的端口中啟動一個telnet會話(您可以檢查模擬器窗口標題中的端口,開頭的數字,在我的情況下為5554):

     telnet localhost 5554 

然后運行命令

    geo fix -122.4 37.78

如果您關閉應用程序,則需要重新發送地理位置,因此如果它不起作用,只需在打開應用程序之后,在超時事件觸發之前運行geo fix命令。

如果您使用的是真正的Android設備,請確保它已啟用GPS,並且您已安裝geolocation插件(運行phonegap local plugin add org.apache.cordova.geolocation

我通過不指定maximumAge和timeout來解決運行最新Android(物理設備)的HTC M8的問題。

navigator.geolocation.getCurrentPosition(onSuccess, onError, {
  // maximumAge: 100,
  // timeout: 2000,
  enableHighAccuracy: true
});

在iPhone 5上它運行良好,但Android只返回錯誤。 現在兩個都沒有問題。 我會注意到我甚至嘗試了1小時的最大時間和高超時,但這不起作用。 這是適用於所有方案的唯一解決方案。

Phonegap使用與Geolocation API相同的界面,您也可以在沒有Phonegap庫的常規Web應用程序中使用它。

規格

TIMEOUT(數值3)
在實現成功獲取新的Position對象之前,timeout屬性指定的時間長度已經過去。

因此,您可以嘗試提供更高的超時值作為參數。 如果您唯一的提供商是GPS,10秒的時間非常短。 在這種情況下,即使在戶外,修復也可能需要40到60秒。

這種故障(這是我的情況)的另一個原因是手動安裝apk並且不向應用授予相關權限。 例如:

網絡通信:查看Wi-Fi狀態,創建藍牙連接,完全上網,查看網絡狀態

您的位置:訪問額外的位置提供商命令,精細(GPS)位置,模擬測試位置源,粗略(基於網絡)位置

在此輸入圖像描述

+有關權限的信息: http//developer.android.com/guide/topics/security/permissions.html

我已經嘗試過使用ngCordova的cordova-plugin-geolocation,但它總是返回我Timeout錯誤,這意味着它在我的5分鍾設置超時中無法獲得設備的位置,所以至少Android 5.1的最終解決方案:我已經添加了權限到AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NETWORK_ACCESS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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" />

沒有ACCESS_WIFI_STATE權限它無法正常工作。

現在即使沒有SIM卡也能正常工作,連接了wifi並啟用了位置。

如果有人會發現它有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM