Android Geocoder oppfører seg annerledes på enkelte enheter

stemmer
0

Jeg har den under kode, det fungerer perfekt på enkelte enheter og i andre funksjonen getFromLocationName returnere en liste med størrelse 0.

For eksempel i Nexus 6pden returnerer riktig resultat, og i Meizu MX5den returnerer en liste med størrelse 0.

Jeg har de samme rettigheter og GPS aktivere for begge enhetene. Android-versjonen på Nexus 6per 7.1.2 og på Meizu MX5er 5.1

  Geocoder geocoder = new Geocoder(context);
  List<Address> addresses = geocoder.getFromLocationName(place, 3);

Merknader :

  1. stedet er beliggenheten gikk brukeren (String).
  2. Geocoder er fra android.location.Geocoder;

Så hvorfor forskjellen? Er det knyttet til Android-versjonen på enhetene?

Publisert på 02/11/2017 klokken 07:58
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Geocoder i Android er egentlig ikke har det samme problemet på alle enheter. Jeg har testet Geocoder med følgende enheter:

  • Samsung (Android 4.4 og 5.1)
  • Lenovo (Android 5.0)
  • Vivo (Android 6.0.1)
  • Andromax (Android 5.1.1)
  • Xiaomi (Android 5.1)

Alle enhetene retur listen, men Xiaomi, returnerer null lister. Så, vi kan ikke stole på Geocoder. Løsningen er å lage vår egen Geocoder implementering bruke Google Geokoding API og bruke den når listen returnerer 0.

Her gjennomføringen av Geocoder (jeg fant det fra SO, men kan ikke huske kilden) som kan brukes exatly som bruker Geocoder:

import android.location.Address;
import android.util.Log;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MyGeocoder {

  public static final String TAG = MyGeocoder.class.getSimpleName();

  static OkHttpClient client = new OkHttpClient();

  public static List<Address> getFromLocation(double lat, double lng, int maxResult) {

    String address = String.format(Locale.US,
        "https://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=false&language="
            + Locale.getDefault().getCountry(), lat, lng);
    Log.d(TAG, "address = " + address);
    Log.d(TAG, "Locale.getDefault().getCountry() = " + Locale.getDefault().getCountry());

    return getAddress(address, maxResult);

  }

  public static List<Address> getFromLocationName(String locationName, int maxResults)  {

    String address = null;
    try {
      address = "https://maps.google.com/maps/api/geocode/json?address=" + URLEncoder.encode(locationName,
          "UTF-8") + "&ka&sensor=false";
      return getAddress(address, maxResults);
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    return null;
  }

  private static List<Address> getAddress(String url, int maxResult) {
    List<Address> retList = null;

    Request request = new Request.Builder().url(url)
        .header("User-Agent", "OkHttp Headers.java")
        .addHeader("Accept", "application/json; q=0.5")
        .build();
    try {
      Response response = client.newCall(request).execute();
      String responseStr = response.body().string();
      JSONObject jsonObject = new JSONObject(responseStr);

      retList = new ArrayList<Address>();

      if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) {
        JSONArray results = jsonObject.getJSONArray("results");
        if (results.length() > 0) {
          for (int i = 0; i < results.length() && i < maxResult; i++) {
            JSONObject result = results.getJSONObject(i);
            Address addr = new Address(Locale.getDefault());

            JSONArray components = result.getJSONArray("address_components");
            String streetNumber = "";
            String route = "";
            for (int a = 0; a < components.length(); a++) {
              JSONObject component = components.getJSONObject(a);
              JSONArray types = component.getJSONArray("types");
              for (int j = 0; j < types.length(); j++) {
                String type = types.getString(j);
                if (type.equals("locality")) {
                  addr.setLocality(component.getString("long_name"));
                } else if (type.equals("street_number")) {
                  streetNumber = component.getString("long_name");
                } else if (type.equals("route")) {
                  route = component.getString("long_name");
                }
              }
            }
            addr.setAddressLine(0, route + " " + streetNumber);

            addr.setLatitude(
                result.getJSONObject("geometry").getJSONObject("location").getDouble("lat"));
            addr.setLongitude(
                result.getJSONObject("geometry").getJSONObject("location").getDouble("lng"));
            retList.add(addr);
          }
        }
      }
    } catch (IOException e) {
      Log.e(TAG, "Error calling Google geocode webservice.", e);
    } catch (JSONException e) {
      Log.e(TAG, "Error parsing Google geocode webservice response.", e);
    }

    return retList;
  }
}

Vær oppmerksom på den daglige kvoten som ikke skjedde i Android Geocoder API.

Svarte 02/11/2017 kl. 10:18
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more