एंड्रॉयड जियोकोडर कुछ उपकरणों पर अलग व्यवहार करती है

वोट
0

मैं नीचे दिए गए कोड यह कुछ उपकरणों पर पूरी तरह से काम करता है और दूसरों में समारोह है, getFromLocationName आकार 0 के साथ एक सूची प्रदान।

उदाहरण के लिए, में Nexus 6pयह सही परिणाम देता है और में Meizu MX5यह आकार 0 के साथ एक सूची देता है।

मैं उन्हीं अनुमतियों और जीपीएस दोनों उपकरणों के लिए सक्षम है। पर Android संस्करण Nexus 6p7.1.2 है और पर Meizu MX55.1 है

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

नोट्स :

  1. जगह स्थान उपयोगकर्ता द्वारा दर्ज किया (स्ट्रिंग) है।
  2. जियोकोडर android.location.Geocoder से है;

तो क्यों क्या अंतर है? यह उपकरणों पर Android संस्करण से संबंधित है?

02/11/2017 को 07:58
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
2

एंड्रॉयड में जियोकोडर वास्तव में सभी उपकरणों पर समान व्यवहार न करना पड़े। मैं निम्नलिखित उपकरणों के साथ जियोकोडर का परीक्षण किया है:

  • सैमसंग (Android 4.4 और 5.1)
  • लेनोवो (एंड्रॉयड 5.0)
  • विवो (एंड्रॉयड 6.0.1)
  • Andromax (एंड्रॉयड 5.1.1)
  • Xiaomi (एंड्रॉयड 5.1)

सभी उपकरणों की सूची लौटने लेकिन Xiaomi, यह शून्य सूचियों देता है। तो, हम जियोकोडर पर निर्भर नहीं कर सकते हैं। समाधान का उपयोग कर अपने स्वयं के जियोकोडर कार्यान्वयन बनाने के लिए है गूगल जियोकोडिंग API और इसका इस्तेमाल करते हैं जब भी सूची लौटाती है 0।

यहाँ जो exatly जियोकोडर का उपयोग कर की तरह इस्तेमाल किया जा सकता जियोकोडर की (मैं इसे बहुत से पाया है, लेकिन स्रोत याद नहीं कर सकते) कार्यान्वयन:

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

ध्यान रखें दैनिक कोटा, जिसमें एंड्रॉयड जियोकोडर एपीआई ऐसा नहीं हुआ की।

02/11/2017 को 10:18
का स्रोत उपयोगकर्ता

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