无法从Flickr获取照片,FlickrFetcher报错API Key格式无效
嘿,我来帮你排查这个问题!从LogCat的报错信息来看,其实是两个连锁问题,咱们一步步拆解解决:
首先看最关键的第一个报错:
04-12 13:38:49.351 29910-29923/com.bignerdranch.android.photogallery I/FlickrFetcher: Received JSON: {"stat":"fail","code":100,"message":"Invalid API Key (Key has invalid format)"}
这说明你的Flickr API密钥格式不对,导致Flickr直接返回了失败的响应,根本没有返回你代码预期的photos字段,所以才触发了第二个解析异常:
04-12 13:38:49.351 29910-29923/com.bignerdranch.android.photogallery E/FlickrFetcher: Failed to parse JSON: org.json.JSONException: No value for photos
1. 先搞定API密钥的问题
- 先确认你用的API密钥是否正确:Flickr的API密钥是一串16位左右的字母数字组合,检查代码里的密钥有没有拼写错误、多打了空格或者少了字符。
- 确保请求URL里的
api_key参数拼接正确,比如你的请求URL应该是类似这样的:String flickrUrl = "https://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=你的正确密钥&format=json&nojsoncallback=1"; - 要是还没申请密钥,直接去Flickr开发者中心注册一个就行(注意选个人开发者类型,密钥很快就能拿到)。
2. 给JSON解析加个“失败兜底”逻辑
你的代码现在默认Flickr会返回成功的响应,但实际遇到错误时返回的是带stat:fail的JSON,所以得先判断响应状态再解析:
// 假设你已经拿到了返回的JSON字符串jsonResponse JSONObject rootJson = new JSONObject(jsonResponse); String responseStatus = rootJson.getString("stat"); if ("fail".equals(responseStatus)) { // 处理API失败的情况,把错误信息打出来方便排查 int errorCode = rootJson.getInt("code"); String errorMsg = rootJson.getString("message"); Log.e("FlickrFetcher", "API请求失败: 错误码" + errorCode + ",信息:" + errorMsg); // 这里可以返回null或者抛出自定义异常,让上层逻辑处理 return null; } else { // 原来的成功解析逻辑,获取photos字段 JSONObject photosObj = rootJson.getJSONObject("photos"); // ... 继续解析照片列表的逻辑 }
3. 验证请求URL是否正确
在发送网络请求前,把完整的URL打印出来:
Log.d("FlickrFetcher", "当前请求URL:" + flickrUrl);
然后把这个URL复制到浏览器里直接访问,看看返回的JSON是什么——如果浏览器里也返回同样的密钥错误,那就是密钥本身的问题;如果浏览器能返回正常的带photos的JSON,那就是代码里拼接URL时出了错。
先解决API密钥的格式/正确性问题(这是根本原因),再给解析逻辑加个错误处理,就能解决你现在遇到的两个报错啦!
内容的提问来源于stack exchange,提问作者amanuel

