【问题标题】:Reverse geocoding is not working in some android devices?反向地理编码在某些 android 设备中不起作用?
【发布时间】:2016-03-31 11:48:38
【问题描述】:

我正在开发一个地图应用程序,无法在此手机上获取地址,它的android版本是4.3,如下所示--

但它在我的手机上运行良好,它的版本是 4.1.2,如下所示--

它在某些棒棒糖版本中运行良好。

    final Geocoder gc = new Geocoder(this, Locale.getDefault());
    try {
        List<Address> addresses = gc.getFromLocation(lat, lng, 1);
        StringBuilder sb = new StringBuilder();
        if (addresses.size() > 0) {
            Address address = addresses.get(0);
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                if (address.getAddressLine(i).equals("null")) {

                } else {
                    sb.append(address.getAddressLine(i)).append("\n");
                    sb.append(address.getLocality()).append("\n");
                    //sb.append(address.getPostalCode()).append("\n");
                    //sb.append(address.getCountryName());
                }
            }
           // Toast.makeText(RegistrationTest.this, "Text Address is " + sb.toString(), Toast.LENGTH_SHORT).show();
            text_address = sb.toString();
        }
    } catch (Exception e) {
        //Toast.makeText(RegistrationTest.this, "exception " + e, Toast.LENGTH_SHORT).show();
    }

对不起我的英语,感谢您的时间和帮助!

请帮帮我,我卡在这里!

【问题讨论】:

标签: android google-maps google-geocoder


【解决方案1】:

并非所有制造商都实施地理编码器。这可能是它在特定设备上不起作用的原因。来自Geocoder 文档:

Geocoder 类需要一个不包含在核心 android 框架中的后端服务。如果平台中没有后端服务,Geocoder 查询方法将返回一个空列表

或者可能存在请求配额。

相反,您可以使用Google Maps geocoding API 之类的远程服务(也可以使用配额)。

【讨论】:

    【解决方案2】:

    地理编码器无法在某些设备上运行。因此,我们需要创建一个自定义地理编码器。您可以使用Geocoder.isPresent() 检查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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多