Android Geocoder gedraagt ​​zich anders op sommige apparaten

stemmen
0

Ik heb de onderstaande code, het werkt perfect op sommige apparaten en in andere de functie getFromLocationName een lijst terug te keren met maat 0.

Bijvoorbeeld, in Nexus 6phet keert het juiste resultaat en in Meizu MX5het keert een lijst met grootte 0.

Ik heb dezelfde rechten en GPS inschakelen voor beide apparaten. Android-versie op het Nexus 6pis 7.1.2 en Meizu MX5is 5.1

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

notities :

  1. plek is de locatie van de gebruiker heeft ingevoerd (String).
  2. Geocoder is van android.location.Geocoder;

Dus waarom het verschil? Is het in verband met de Android-versie op de apparaten?

De vraag is gesteld op 02/11/2017 om 07:58
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Geocoder in Android is echt niet hetzelfde gedrag op alle apparaten hebben. Ik heb de Geocoder getest met de volgende apparaten:

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

Alle apparaten retourneren van de lijst, maar Xiaomi, keert nul lijsten. Dus, kunnen we niet afhankelijk zijn van Geocoder. De oplossing is om onze eigen Geocoder implementatie maken met behulp van Google Geocoding API en gebruiken wanneer de lijst is het resultaat 0.

Hier de uitvoering van Geocoder (ik vond het van SO, maar kan me niet herinneren de bron), die exatly kan worden gebruikt als het gebruik van de 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;
  }
}

Wees je bewust van de dagelijkse quotum dat niet gebeurde in Android Geocoder API.

antwoordde op 02/11/2017 om 10:18
bron van user

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