Android Geocoder συμπεριφέρεται διαφορετικά σε ορισμένες συσκευές

ψήφοι
0

Έχω τον παρακάτω κώδικα, λειτουργεί άψογα σε ορισμένες συσκευές και σε άλλες η λειτουργία getFromLocationName επιστρέψει μια λίστα με μέγεθος 0.

Για παράδειγμα, σε Nexus 6pαυτό επιστρέφει το σωστό αποτέλεσμα και Meizu MX5επιστρέφει μια λίστα με μέγεθος 0.

Έχω τα ίδια δικαιώματα και GPS επιτρέπει και για τις δύο συσκευές. Android έκδοση για το Nexus 6pείναι 7.1.2 και Meizu MX5είναι 5.1

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

Σημειώσεις :

  1. το μέρος είναι η τοποθεσία μπήκε ο χρήστης (String).
  2. Geocoder είναι από android.location.Geocoder?

Γιατί λοιπόν η διαφορά; Έχει σχέση με την έκδοση Android στις συσκευές;

Δημοσιεύθηκε 02/11/2017 στις 07:58
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Geocoder το Android είναι πραγματικά δεν έχουν την ίδια συμπεριφορά σε όλες τις συσκευές. Δοκίμασα την Geocoder με τις ακόλουθες συσκευές:

  • Samsung (Android 4.4 και 5.1)
  • Lenovo (Android 5.0)
  • Vivo (Android 6.0.1)
  • Andromax (Android 5.1.1)
  • Xiaomi (Android 5.1)

Όλες οι συσκευές επιστροφή στη λίστα, αλλά Xiaomi, επιστρέφει μηδέν λίστες. Έτσι, δεν μπορούμε να εξαρτάται από Geocoder. Η λύση είναι να δημιουργήσουμε τη δική μας εφαρμογή Geocoder χρησιμοποιώντας το Google Geocoding API και να το χρησιμοποιήσετε κάθε φορά που ο κατάλογος επιστρέφει 0.

Εδώ η εφαρμογή της Geocoder (το βρήκα από ΑΑ, αλλά δεν μπορείτε να θυμηθείτε την πηγή), το οποίο μπορεί να χρησιμοποιηθεί exatly όπως η χρησιμοποίηση του 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;
  }
}

Να είστε ενήμεροι για το ημερήσιο όριο το οποίο δεν συνέβη στο Android Geocoder API.

Απαντήθηκε 02/11/2017 στις 10:18
πηγή χρήστη

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