Android géocodage se comporte différents sur certains appareils

voix
0

J'ai le code ci - dessous, il fonctionne parfaitement sur certains appareils et dans d' autres la fonction getFromLocationName retourner une liste avec la taille 0.

Par exemple, dans Nexus 6pelle renvoie le résultat correct et Meizu MX5elle retourne une liste avec la taille 0.

J'ai les mêmes autorisations et GPS permettent pour les deux appareils. Android version sur le Nexus 6pest 7.1.2 et Meizu MX5est 5.1

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

notes :

  1. endroit est l'emplacement entré par l'utilisateur (String).
  2. Geocoder est de android.location.Geocoder;

Alors, pourquoi la différence? Est-il lié à la version Android sur les appareils?

Créé 02/11/2017 à 07:58
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Géocodage dans Android est vraiment ne pas le même comportement sur tous les appareils. Je l'ai testé le géocodage avec les appareils suivants:

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

Tous les dispositifs retournant la liste mais Xiaomi, il renvoie zéro listes. Donc, nous ne pouvons pas dépendre de géocodage. La solution est de créer notre propre implémentation géocodage en utilisant l' API Google géocodage et de l' utiliser à chaque fois que la liste retourne 0.

Ici, la mise en œuvre de géocodage (je l'ai trouvé de SO, mais ne peut pas se souvenir de la source) qui peut être utilisé exatly comme l'utilisation du géocodage:

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

Soyez conscient du quota quotidien qui ne se produit pas dans l' API Android géocodage.

Créé 02/11/2017 à 10:18
source utilisateur

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