7

Trong ứng dụng của chúng tôi, chúng tôi đã sử dụng Nhà cung cấp vị trí hợp nhất (FLP) để theo dõi vị trí. Chúng tôi đã nhận thấy rằng thỉnh thoảng ứng dụng có thể vào trạng thái nơi cuộc gọi lại vị trí ngừng được gọi. Ứng dụng được đề cập được sử dụng chủ yếu trên hai máy tính bảng (một nexus 7 và LG G-pad 8.3). Chúng tôi đã thấy sự cố xảy ra trên cả hai thiết bị. Nói chung đặt lại thiết bị có vẻ như làm giảm bớt vấn đề. Chúng tôi tin rằng chúng tôi tuân theo hầu hết các phương pháp hay nhất để sử dụng FLP. Nhưng chỉ trong trường hợp chúng tôi đặt cùng mã mẫu này minh họa cách chúng tôi sử dụng FLP.Nhà cung cấp địa điểm hợp nhất - onLocationChỉ dừng được gọi là

Nhận một khách hàng google api và gọi kết nối:

m_googleApiClient = builder 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
m_googleApiClient.connect() 

Sau khi kết nối, chúng tôi bắt đầu nghe cho callbacks vị trí:

@Override 
public void onConnected(Bundle bundle) { 
    m_fusedLocationProviderApi.requestLocationUpdates(m_googleApiClient, m_locationRequest, this); 
} 

Các yêu cầu vị trí trông như thế này:

LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

Sau đó, chúng tôi thực hiện cuộc gọi lại như sau:

@Override 
public void onLocationChanged(Location location) { 
    // set location member var and record timestamp. 
} 

Khi sự cố xảy ra, chúng tôi dường như không nhận được bất kỳ lỗi gọi lại nào. Chúng tôi cũng đã thử gọi lại thiết lập lại() trên ứng dụng khách Google api khi chúng tôi phát hiện chúng tôi chưa nhận được GPS trong một thời gian dài. Chúng tôi cũng giám sát tình trạng sẵn có của vị trí bằng cách sử dụng bộ hẹn giờ cứ 2 giây một lần (sử dụng getLocationAvailability). Thông thường, chúng tôi thấy rằng việc người dùng đặt lại thiết bị của họ (bật nguồn, tắt nguồn) sẽ khắc phục sự cố.

câu hỏi của chúng tôi là:

  1. Đã có người khác nhận thấy vấn đề này với FLP?
  2. Chúng tôi có thể làm gì nhiều hơn để khắc phục sự cố không cho người dùng đặt lại? Việc xóa thêm cập nhật vị trí có giúp được không?
  3. Có thêm thông tin chúng tôi có thể/nên thu thập để chẩn đoán sự cố không?
+0

Tôi gặp vấn đề chính xác tương tự. Bạn đang sử dụng phiên bản Dịch vụ Google Play nào và bạn có phiên bản hệ điều hành nào trên thiết bị khi tôi tự hỏi liệu điều đó có tạo nên sự khác biệt không? –

+0

Gần đây tôi đã bắt đầu sử dụng 9.2.1 và chưa thấy vấn đề ở đó (ngón tay bị gạch chéo). – noahd

+1

Tôi đã nhận được chính xác cùng một vấn đề gần đây. Bạn đã thấy vấn đề này từ khi nâng cấp phiên bản Dịch vụ Google Play của mình chưa. Cảm ơn bạn. –

Trả lời

3

Tôi đã làm việc với FusedLocationProvider rộng rãi trên một dải rộng các thiết bị, cả hai mức thấp nhất và đã gặp các vấn đề tương tự khi dữ liệu GPS có bản vá lỗi ở giữa. Bởi vì điều này, tôi đã thực hiện một vài thay đổi phục vụ cho những vấn đề này liên quan đến độ tin cậy & độ bền (như được liệt kê bên dưới) và chưa thấy những vấn đề này sau đó.

Theo kinh nghiệm của tôi, các giải pháp khả thi cho các vấn đề đó là:

  1. Đang cập nhật dịch vụ Play: Tôi đã sử dụng Android phiên bản dịch vụ trò trong khoảng 7.x - 8.x khi Tôi đã có những vấn đề này.

    Sol: Trong thời gian qua, cập nhật lên phiên bản 10.x các dịch vụ chơi đã giúp trong việc giải quyết các vấn đề. Chúng tôi đã không nhìn thấy những vấn đề này đăng cập nhật, vì vậy điều này chắc chắn có thể là một trong những lý do trong trường hợp của bạn là tốt.

  2. Làm Android Dịch vụ đáng tin cậy hơn & mạnh mẽ: Đây là một trong những lý do chính chúng ta đã thấy mất điện trong dữ liệu GPS và khi khởi động lại thiết bị hoặc khởi tạo thiết lập một lần nữa, chúng ta thường khởi động lại dịch vụ. Và do đó, dịch vụ khởi động lại có thể tiếp tục cập nhật vị trí thành bình thường.

    Sol: tôi sử dụng một dịch vụ Foreground thay vì dịch vụ nền và điều này đến nay là giải pháp đáng tin cậy nhất ở đây nhưng điều này đi kèm với một thông báo UI dính cho người dùng. Nếu không cho điều này, sau đó giữ một kiểm tra sức khỏe (chạy hoặc bị giết) cho các dịch vụ nền có thể là một lựa chọn tốt là tốt.

  3. Sẽ kết nối lại GoogleAPIClient đình chỉ kết nối/lỗi tôi đã thấy tình huống mà kết nối GoogleAPIClient bị đình chỉ hoặc trả về một lỗi vì điều kiện mạng xấu hoặc lý do khác. Mặc dù tôi đã không thể xác nhận một tác động trực tiếp của điều này về việc mất dữ liệu vị trí, điều này rất có thể là một lý do trong trường hợp này. Để hỗ trợ điều này, việc đặt lại các cập nhật vị trí sẽ không thành công trong trường hợp vấn đề kết nối GoogleAPIClient này xảy ra và đây cũng là những gì bạn đã quan sát được.

    Sol: Một kết nối lại đơn giản của GoogleAPIClient đình chỉ hoặc lỗi có thể giải quyết này.

Bên cạnh đó, có thêm một lý do nào có thể chịu trách nhiệm về vấn đề này:

thiết bị GPS năng khắc phục mất: Có những lần khi thiết bị mất sửa chữa GPS của nó dẫn đến việc không có dữ liệu GPS cho đến khi nó có thể lấy lại bản sửa lỗi GPS. Hoàn toàn không có cách nào để xác định xem vị trí có bị mất do sửa chữa GPS hay không. Đặt lại cài đặt vị trí của thiết bị có tác động của thiết bị đang cố gắng khắc phục GPS, điều này cũng có thể là lý do tại đây.

KHUYẾN CÁO: Tôi là nhà phát triển Android @HyperTrack và chúng tôi đang phát triển ngăn xếp vị trí cho nhà phát triển đang xây dựng tính năng vị trí trong ứng dụng của họ và đây là những vấn đề chúng tôi đã giải quyết. Thật tuyệt vời khi bạn thử nghiệm các kịch bản tương tự bằng cách sử dụng SDKs của chúng tôi và trong trường hợp bạn vẫn gặp sự cố, chúng tôi sẽ sẵn lòng giúp bạn trong việc đạt được nguyên nhân gốc rễ và khắc phục sự cố.

+0

Tôi đánh giá cao câu trả lời chi tiết! – noahd

-2

Bạn có thể thử để kiểm tra LocationSettings như thế này:

request = LocationRequest.create(); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(request); 
    builder.setAlwaysShow(true); 
    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(apiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(@NonNull LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        try { 
         status.startResolutionForResult(context, REQUEST_CODE); 
        } catch (IntentSender.SendIntentException e) {} 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        break; 
      } 
     } 
    }); 

sau đó xử lý các thiết lập yêu cầu trong onActivityResult

switch (requestCode) { 
    case REQUEST_CODE: 
     switch (resultCode) { 
     case Activity.RESULT_OK: 
     // All required changes were successfully made 
     LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
     break; 
     case Activity.RESULT_CANCELED: 
     // The user was asked to change settings, but chose not to 
     break; 
     default: 
     break; 
     } 
    break; 
} 

Nếu nó không giúp đỡ, cố gắng hạ cấp google-play-dịch vụ phiên bản.

+0

Có Tôi biết về việc kiểm tra cài đặt này. Tôi không nghĩ rằng có một vấn đề với các thiết lập ... Tôi thực sự nhận được gọi lại hầu hết thời gian. Vấn đề là đôi khi chúng tôi nhận được vào một trạng thái mà các cuộc gọi dừng lại xảy ra các thiết bị đã được thiết lập lại để bắt đầu nhận được nó một lần nữa. – noahd

Các vấn đề liên quan