Android 8.0无法调用Geocoder 中的getFromLocation()解决办法

博客提到关键步骤是开启一个线程去调用getAddress()方法,涉及多线程编程相关信息技术内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:用一个工具类存放getAddress()方法
/**
 * 根据经纬度获取地理位置
 * * @param context 上下文
 *
 * @param latitude  纬度
 * @param longitude 经度
 * @return {@link Address}
 */
public static Address getAddress(Context context, double latitude, double longitude) {
    Geocoder geocoder = new Geocoder(context, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.size() > 0)
            return addresses.get(0);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

第二步:开一个线程去调起getAddress()方法(关键)

new Thread() {
    @Override
    public void run() {
        //需要在子线程中处理的逻辑
      
        if (location != null) {
       Address tempAddress = LocationUtil.getAddress(context,location.getLatitude(),location.getLongitude());
        }   
    }
}.start();

第三步:从子线程中拿出解析后的地址

(在调用前先准备好)

public void getAdress(final LatLon latLon){
    if (latLon != null){
        new Thread() {
            @Override
            public void run() {
                //设置地理地址
                Address address = LocationUtil.getAddress(DCTableActivity.this, latLon.getLat(), latLon.getLon());
                if (address != null) {
                    String locationAddr = address.getAddressLine(0).replace("Unnamed Road", "");
                    SharedPreferences.Editor editor = getCacheEdit();
                    editor.putString(GEOGRAPHICAL_POSITION,locationAddr);
                    editor.commit();
                }
            }
        }.start();
    }
}
<think>好的,我现在需要处理用户关于Android Geocoder类的使用方法和文档的查询。首先,用户可能是一个Android开发者,正在开发需要地理编码或逆地理编码功能的应用。他可能遇到了具体的问题,或者需要了解如何集成这个功能。 首先,我应该回忆一下Android Geocoder类的基本信息。Geocoder类属于Android的位置服务,用于将地址转换为经纬度(地理编码)或反之(逆地理编码)。不过要注意的是,这个类依赖于后台服务,可能因设备和网络状况不同而有不同的表现,甚至在某些设备上不可用。比如,如果设备没有Google服务,Geocoder可能无法正常工作,这时候可能需要备用方案,比如使用第三方API。 接下来,用户需要的是使用方法和文档。我应该先确认官方文档的链接是否正确,并提供给用户。根据引用[2],Android的逆地理编码是资源密集型任务,所以可能需要提醒用户进行缓存或预处理,如引用中提到的使用Google Maps Geocoding API或其他服务预先处理地址,并缓存结果。这可能对性能有帮助。 然后,我需要给出一个基本的使用示例。比如,如何初始化Geocoder调用getFromLocationName进行地理编码,或者getFromLocation进行逆地理编码。同时,需要强调这些方法是同步的,应该在后台线程执行,避免阻塞主线程。另外,处理可能出现的异常,如IO异常或没有后端服务的情况。 用户可能遇到的问题包括:Geocoder返回空数据,或者在某些设备上不工作。这时候,可能需要建议备用方案,比如使用第三方库如geopy(引用[3]提到的)或Google Maps API。例如,引用[3]中提到的geopy支持多种服务,可以作为一个替代方案。 另外,要注意Android版本和设备兼容性问题。GeocoderAndroid 8.0(API 26)之后的行为是否有变化?比如,是否需要添加位置权限,或者是否需要网络访问权限。用户可能忘记添加这些权限,导致功能失效,所以应该在回答中提到权限需求。 还有,是否需要处理地理位置解析结果中的多地址情况?比如,一个地址可能有多个可能的经纬度,这时候需要让用户知道如何处理列表中的多个结果。 最后,生成相关问题,帮助用户进一步探索。比如,性能优化、备用方案、权限处理等,这些问题可能都是用户接下来会关心的。</think>### Android Geocoder 类使用指南 #### 1. 核心功能 Android `Geocoder` 类提供**地理编码**(地址转经纬度)和**逆地理编码**(经纬度转地址)功能,基于设备本地服务实现,需注意以下特性: - 依赖设备底层地理编码服务,部分设备可能不支持 - 需联网权限(`INTERNET`)[^2] - 同步方法需在后台线程执行 #### 2. 基础用法示例 ```java // 地理编码(地址 -> 坐标) List<Address> addresses = geocoder.getFromLocationName("东方明珠电视塔", 1); if (!addresses.isEmpty()) { double lat = addresses.get(0).getLatitude(); double lng = addresses.get(0).getLongitude(); } // 逆地理编码(坐标 -> 地址) List<Address> addresses = geocoder.getFromLocation(31.2396, 121.4998, 1); if (!addresses.isEmpty()) { String addressLine = addresses.get(0).getAddressLine(0); } ``` #### 3. 关键注意事项 1. **服务可用性检查** ```java if (!Geocoder.isPresent()) { // 使用备用方案(如Google Maps API) } ``` 2. **异常处理** ```java try { List<Address> addresses = geocoder.getFromLocation(...); } catch (IOException e) { // 处理网络异常 } ``` 3. **性能优化建议** - 限制返回结果数量(第三个参数) - 实现结果缓存机制[^2] - 使用异步任务(AsyncTask 或 WorkManager) #### 4. 官方文档 - [Geocoder 类文档](https://developer.android.com/reference/android/location/Geocoder) - 推荐结合使用 [LocationManager](https://developer.android.com/reference/android/location/LocationManager) #### 5. 替代方案建议 当设备不支持时,可考虑: - Google Maps Geocoding API(需API key) - 开源库如 [geopy](https://github.com/geopy/geopy)[^3] - 开源解决方案 [OpenStreetMap Nominatim](https://nominatim.openstreetmap.org/)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值