从OpenWeatherMap API提取JSON数据至Logcat时遇权限错误求助
问题分析与解决方案
先帮你理清两个核心点:那个系统警告和你的API请求问题。
关于Access denied finding property "persist.vendor.log.tel_dbg"错误
这个错误和你的天气API请求完全无关,它是Android系统层面的警告——系统在尝试读取一个运营商调试日志的系统属性,但没有足够权限,属于系统级的日志噪音,不会影响你的APP功能,直接忽略它就行,重点关注你自己的Result日志输出。
你的API请求代码需要修复的问题
我看了你的代码,有几个关键问题可能导致你拿不到正确的API数据:
1. URL中的转义字符错误
你写的API URL里用了&,这是HTML的转义字符,在Java字符串里应该直接用&来分隔参数,否则服务器无法正确解析你的请求参数。修改后的URL应该是:
String api = "http://api.openweathermap.org/data/2.5/weather?q=kolkata&appid=e8cd0e5f8d3ba1e87d108da87d9c0a94";
2. 缺少网络权限
Android应用要发起网络请求,必须在AndroidManifest.xml中声明互联网权限,否则会被系统拦截请求。添加以下代码到你的Manifest文件里(放在<application>标签外面):
<uses-permission android:name="android.permission.INTERNET" />
3. 输入流读取优化(推荐)
你当前逐个字符读取输入流的方式效率很低,建议换成BufferedReader批量读取,同时增加响应码检查和资源关闭逻辑,避免异常:
@Override protected String doInBackground(String... urls) { String result = ""; URL url; HttpURLConnection urlConnection = null; try { url = new URL(urls[0]); urlConnection = (HttpURLConnection) url.openConnection(); // 先检查响应码,确保请求成功 int responseCode = urlConnection.getResponseCode(); if (responseCode != HttpURLConnection.HTTP_OK) { return "请求失败,响应码:" + responseCode; } InputStream in = urlConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { result += line; } } catch (MalformedURLException e) { e.printStackTrace(); return "URL格式错误:" + e.getMessage(); } catch (IOException e) { e.printStackTrace(); return "网络IO错误:" + e.getMessage(); } finally { // 记得关闭连接,避免资源泄漏 if (urlConnection != null) { urlConnection.disconnect(); } } return result; }
4. 额外提示:AsyncTask已被弃用
虽然你的代码用AsyncTask能正常运行,但Android已经废弃了这个API,如果是新项目,建议改用Coroutines或者OkHttp+Executor来处理网络请求,这是后续优化的方向。
验证修改效果
做完以上修改后,重新运行APP,去Logcat里找Result标签的输出:
- 如果成功,你会看到OpenWeatherMap返回的JSON数据
- 如果还是有问题,查看Logcat里的异常信息,比如是否是APPID无效、网络连接问题等
内容的提问来源于stack exchange,提问作者Sanjeev Jha
相关产品推荐
相关产品推荐

