2017-07-20 20 views
7

Geokoder działał poprawnie do dzisiaj. Zaczął zwracać łańcuch o długości 0. Uwaga: Nie jest to duplikat wątków Geocoder, użyłem usługi intent i AsyncTask, aby uzyskać ją przed uruchomieniem wątku (i metoda AsyncTask działała dobrze przez ponad 8 miesięcy), sprawdzono pod this code i nową code od Google za pomocą FusedLocationProviderClient (jest to oficjalna kod) zwraca również ciąg o zerowej długości. This link z oficjalnej strony systemu Android pokazuje, jak uzyskać to za pomocą usługi intencji.Geokodulator zwraca adres o zerowej długości

Otrzymuję pełny adres w systemie Android 5.1, ale na Androidzie 7.1 zwraca on adres o długości zero.

Kod, którego używałam i pracowałam do dzisiaj.

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

Odpowiedź jest dodanie = do pętli nie retreive adres z zerowej długości na Androida 7. Nie trzeba tego robić w niektórych wersjach. Brakuje również kodu na stronach Github, do których odsyłają Google. =. Dlatego nie mogłem znaleźć przyczyny.

Odpowiedz

8

Problemem jest to linia:

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

Musi być: do (int i = 0; i < = adres.getMaxAddressLineIndex(); i ++) Ponieważ getMaxAddressLineIndex zwraca największy indeks.

+1

Tak, = jest to, co powinno być dodane, ale to działa, jeśli nie jest to wersja Androida 7. To bardzo interesujące. Czy ktoś może wyjaśnić, dlaczego działa, jeśli wersja nie jest Anroid 7? – Thracian

+0

Ten sam błąd znaleziono w urządzeniu z uruchomionym 5.1.1 – Kennet

+0

Yeap, który działał. Co za dziwna zmiana w ich API. –

1

Właśnie zauważyłem dokładnie ten sam problem w swoim kodzie jakiś czas temu. Wygląda na to, że jest to zmiana w interfejsie API, jak widać w documentation. Teraz getMaxAddressLineIndex():

Powoduje zwrócenie największego obecnie używanego indeksu do określenia linii adresowej. Jeśli nie podano linii adresu, zwracane jest -1.

Więc trzeba zmienić stan swojego pętli for jak sugeruje @DavidBar

+0

Tak, wyglądałem dzisiaj i brakowało dodania '=' do pętli. Interesujące jest to, że działa na systemach Android 5 i 6 bez znaku równości. Naprawdę zastanawiam się, dlaczego nie działa na niektórych wersjach Androida i działa na innych. – Thracian