2017-07-20 14 views
7

Bộ mã hóa địa lý hoạt động tốt cho đến ngày hôm nay. Nó bắt đầu trả về String với độ dài là 0. Lưu ý: Đây không phải là bản sao của chủ đề Geocoder, tôi đã sử dụng dịch vụ ý định và AsyncTask để nhận nó trước khi bắt đầu chuỗi (và cách tiếp cận AsyncTask hoạt động tốt hơn 8 tháng), đã kiểm tra this code và mới code từ Google với FusedLocationProviderClient (đây là chính thức code) nó cũng trả về chuỗi có độ dài bằng 0. This link từ trang chính thức của Android cho biết cách thực hiện nó với dịch vụ có mục đích.Bộ mã hóa địa lý trả lại địa chỉ có độ dài bằng không

Tôi nhận được địa chỉ đầy đủ trên Android 5.1 nhưng trên Android 7.1, nó trả về địa chỉ có độ dài bằng không.

Mã tôi đã sử dụng và hoạt động tốt cho đến hôm nay.

private void getAddressFromCoordinates() { 

    new AsyncTask<Void, String, Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       addresses.clear(); 
       addresses.addAll(geocoder.getFromLocation(mCurrentLocation.getLatitude(), 
         mCurrentLocation.getLongitude(), 1)); 


      } catch (IOException e) { 
       e.printStackTrace(); 
       showToastAsync(getString(R.string.activity_loc_no_location_info)); 
      } catch (IllegalArgumentException illegalArgumentException) { 
       // Catch invalid latitude or longitude values. 
       showToastAsync("Invalid latitude or longitude values"); 
      } 

      // Handle case where no address was found. 
      if (addresses == null || addresses.size() == 0) { 
       showToastAsync(getString(R.string.activity_loc_no_address_is_found)); 
      } else { 
       Address address = addresses.get(0); 
       ArrayList<String> addressFragments = new ArrayList<String>(); 
       for (int i = 0; i < address.getMaxAddressLineIndex(); i++) { 
        addressFragments.add(address.getAddressLine(i)); 
       } 

       addressInfo = TextUtils.join(System.getProperty("line.separator"), addressFragments); 
       addressSingleLine = LocationActivity.addressInfo.replaceAll("[\r\n]+", " "); 
      } 
      return null; 
     } 

    }.execute(); 
} 

trả lời là thêm = để cho vòng lặp để không truy xuất một địa chỉ với số không dài trên Android 7. Bạn không cần phải làm điều này trên một số phiên bản. Ngoài ra mã trên các trang Github được Google tham chiếu bị thiếu =. Đó là lý do tại sao tôi không thể tìm ra lý do tại sao.

Trả lời

8

Vấn đề là dòng này:

for (int i = 0; i < address.getMaxAddressLineIndex(); i ++)

Nó phải là: for (int i = 0; i < = address.getMaxAddressLineIndex(); i ++) Bởi vì getMaxAddressLineIndex trả về chỉ số lớn nhất.

+1

Vâng, = là những gì nên được bổ sung nhưng nó hoạt động nếu phiên bản Android không phải là 7. Nó rất thú vị. Bất cứ ai có thể giải thích lý do tại sao nó hoạt động trên nếu phiên bản không phải là Anroid 7? – Thracian

+0

Lỗi tương tự được tìm thấy trong một thiết bị chạy 5.1.1 – Kennet

+0

Yeap đã hoạt động. Thật là một thay đổi kỳ lạ trong API của họ. –

1

Tôi vừa nhận thấy cùng một vấn đề chính xác trong mã của mình một thời gian trước đây. Rõ ràng đây là thay đổi trong API như bạn có thể thấy trong số documentation. Bây giờ getMaxAddressLineIndex():

Trả về chỉ số lớn nhất đang được sử dụng để xác định một dòng địa chỉ. Nếu không có dòng địa chỉ nào được chỉ định, -1 sẽ được trả về.

Vì vậy, bạn cần phải thay đổi điều kiện của for vòng lặp của bạn như đề nghị của @DavidBar

+0

Vâng, tôi đã xem nó ngày hôm nay và thêm '=' vào vòng lặp foor là những gì còn thiếu. Điều thú vị là nó hoạt động trên Android 5 và 6 mà không có dấu bằng. Tôi thực sự tự hỏi tại sao nó không hoạt động trên một số phiên bản Android và làm việc trên các phiên bản khác. – Thracian

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