Пожалуйста. Я хотел бы иметь Meizu MX 5 в качестве тестового устройства!

я есть код ниже, он отлично работает на некоторых устройствах и в других функция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);

Примечания:

место - это местоположение пользователя (строка).Геокодер из android.location.Geocoder;

Так почему разница? Это связано с версией Android на устройствах?

 Vivek Mishra02 нояб. 2017 г., 09:09
как сказал pskink, не обязательно, что вы получите адрес для всего местоположения. Вы все еще можете получить страну и штат тоже, если доступно
 Elior02 нояб. 2017 г., 09:15
Хорошо. Я забыл упомянуть, что на обоих устройствах я использовал одно и то же местоположение. Так почему же на Nexus 6p это успех, а на Meizu - нет? Как вы сказали, если это сервис, который возвращает результат, это означает, что meizu должен вернуть тот же результат, что и нексус, не так ли?
 Elior02 нояб. 2017 г., 09:19
Я проверю его. спасибо :) Так что я думаю, что если я хочу, чтобы он был доступен на всех устройствах, я должен использовать API геокодирования карт Google
 pskink02 нояб. 2017 г., 09:16
ИтакGeocoder DOSC сказать:"The Geocoder class requires a backend service that is not included in the core android framework. The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists." ты проверилisPresent() возвращаемое значение?
 pskink02 нояб. 2017 г., 09:02
возвращаемое значение описывается в javadocs как:"a list of Address objects. Returns null or empty list if no matches were found or there is no backend service available."

Ответы на вопрос(1)

Решение Вопроса

х устройствах. Я проверил геокодер со следующими устройствами:

Samsung (Android 4.4 и 5.1)Lenovo (Android 5.0)Vivo (Android 6.0.1)Андромакс (Android 5.1.1)Xiaomi (Android 5.1)

Все устройства, возвращающие список, кроме Xiaomi, возвращают ноль списков. Итак, мы не можем зависеть от геокодера. Решение состоит в том, чтобы создать нашу собственную реализацию Geocoder, используяGoogle Geocoding API и использовать его всякий раз, когда список возвращает 0.

Вот реализация Geocoder (я нашел ее из SO, но не могу вспомнить источник), которую можно использовать точно так же, как и при использовании 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 нояб. 2017 г., 11:27
Пожалуйста. Я хотел бы иметь Meizu MX 5 в качестве тестового устройства!
 Elior02 нояб. 2017 г., 11:22
Большое спасибо, это то, что я думал сделать :) Итак, вы также можете добавить Meizu MX 5 в свой список :)

Ваш ответ на вопрос