调用Google Maps附近地点搜索API出现FileNotFoundException如何解决
问题解决方案
1. 修复Places API请求404报错
你出现FileNotFound异常的核心原因是用了错误的接口域名,旧版谷歌周边搜索接口的正确域名是maps.googleapis.com,不是你在用的maps.google.com,直接替换请求前缀即可:
把URL前缀从https://maps.google.com/maps/api/place/nearbysearch/json
替换为https://maps.googleapis.com/maps/api/place/nearbysearch/json
另外还要做两项校验:
- 确认谷歌云控制台已经单独开启了Places API权限,仅开启Maps系列API无法调用地点搜索接口
- 检查API Key的限制规则,如果设置了安卓应用专属限制,要确认填写的包名、SHA1签名和你当前编译的应用完全匹配
你还可以在downloadUrl方法里先读取接口返回码,报错时读取错误流拿到官方返回的具体错误原因,方便快速定位问题:
int responseCode = connection.getResponseCode(); if (responseCode != 200) { // 非200状态时读错误流拿报错信息 InputStream errorStream = connection.getErrorStream(); // 打印errorStream内容即可看到具体错误提示,比如Key无效、API未开等 }
2. 修复拿不到用户位置的问题
FusedLocationProviderClient.getLastLocation()返回null属于正常情况,这个方法只会读取系统缓存的位置,当设备近期没有其他应用请求过位置时缓存为空就会返回null,另外你还缺了权限申请的回调处理,做以下修改即可:
- 补全权限申请回调,用户同意权限后主动触发位置获取:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 44 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); } }
- 给位置请求加失败监听,缓存为空时主动请求实时位置,或者提示用户先开启设备定位开关
- 点击查找按钮时先判断经纬度是否还是初始值0,确认拿到位置后再发起接口请求,避免生成无效URL
另外补充:AsyncTask已经在Android 11中正式废弃,后续可以换成OkHttp、Volley等更稳定的网络请求库替代现有逻辑。
内容的提问来源于stack exchange,提问作者zahid habib
相关产品推荐
相关产品推荐

