2015-10-01 14 views
6

Tôi đã gặp một số vấn đề với plugin Geolocation Cordova (org.apache.cordova.geolocation). Nó hoạt động tốt trên iOS, nhưng nó không hề có trên Android. Theo tôi hiểu, plugin được sử dụng để bao gồm mã Android gốc, nhưng điều này đã bị xóa tại một thời điểm nào đó, bởi vì plugin quá chậm/chậm và việc triển khai HTML5 trên web nguyên bản ổn định hơn và nhanh hơn nhiều.Plugin Cordova Geolocation trả về đối tượng vị trí trống trên Android

Nếu tôi sử dụng phiên bản plugin mới nhất (0.3.2) mà vẫn có mã gốc, nó hoạt động (nhưng chậm và thực sự, không phải lúc nào). Nhưng khi nó quay trở lại, đối tượng vị trí luôn được phổ biến.

Nếu tôi sử dụng phiên bản plugin mới nhất (1.0.1), getCurrentPosition() ngay lập tức trả về với một đối tượng trống ({}). Nó không ném một lỗi.

Nếu tôi loại bỏ các plugin hoàn toàn, và thêm các điều khoản thủ công vào dự án Android:

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

Điều tương tự cũng xảy ra. Tôi chỉ không thể làm cho nó hoạt động, nhưng nó không có ý nghĩa. Không có lỗi nào được hiển thị trong bảng điều khiển Android. Có suy nghĩ gì không?

Trả lời

21

OK, sau một thời gian dài gỡ lỗi, tôi đã tìm thấy sự cố. Rõ ràng, hàm getCurrentPosition() trả về một đối tượng 'đặc biệt' trong Android, nó đánh giá {} khi sử dụng JSON.stringify(). Nếu tôi xuất ra đối tượng trả về thô cho bàn điều khiển, hóa ra nó không hề trống rỗng chút nào.

Vì vậy, sau lố bịch điều chỉnh cố định mã của tôi:

navigator.geolocation.getCurrentPosition(function (position) { 
    var positionObject = {}; 

    if ('coords' in position) { 
     positionObject.coords = {}; 

     if ('latitude' in position.coords) { 
      positionObject.coords.latitude = position.coords.latitude; 
     } 
     if ('longitude' in position.coords) { 
      positionObject.coords.longitude = position.coords.longitude; 
     } 
     if ('accuracy' in position.coords) { 
      positionObject.coords.accuracy = position.coords.accuracy; 
     } 
     if ('altitude' in position.coords) { 
      positionObject.coords.altitude = position.coords.altitude; 
     } 
     if ('altitudeAccuracy' in position.coords) { 
      positionObject.coords.altitudeAccuracy = position.coords.altitudeAccuracy; 
     } 
     if ('heading' in position.coords) { 
      positionObject.coords.heading = position.coords.heading; 
     } 
     if ('speed' in position.coords) { 
      positionObject.coords.speed = position.coords.speed; 
     } 
    } 

    if ('timestamp' in position) { 
     positionObject.timestamp = position.timestamp; 
    } 

    // Use the positionObject instead of the position 'object' 
    alert(JSON.stringify(positionObject));    
} 

iOS hoạt động tốt mà không cần điều chỉnh trên, nhưng khi ứng dụng của tôi là một ứng dụng PhoneGap, tôi luôn áp dụng ở trên.

+1

Cảm ơn cho việc này. Hóa ra 'coords' và' timestamp' là các getters nguyên mẫu 'Geolocation' và tôi đoán' JSON.stringify' chỉ xuất ra các thuộc tính riêng của một đối tượng. –

2

Đối tượng Geolocation truyền cho callbacks trong navigator.geolocation.getCurrentLocation() chứa hai nguyên mẫu getters coordstimestamp, có nghĩa là hasOwnProperty sẽ trả về false, mà tôi cho rằng JSON.stringify không bao gồm.

Khi đăng nhập tất cả các phím trên đối tượng tôi nhận được như sau:

[object Geoposition] 
    .coords [object Coordinates] 
    .latitude 
    .longitude 
    .altitude 
    .accuracy 
    .altitudeAccuracy 
    .heading 
    .speed 
    .timestamp 

Không bao giờ là ít hơn, những giá trị này là hợp lệ khi truy cập bình thường.

+0

Điều đó làm rõ vấn đề. Cảm ơn! –

0

Với kiễu góc, bạn có thể sửa lỗi này với:

location = angular.copy(location) 
Các vấn đề liên quan