Android Studio Java中OutputStream ops报错引发应用崩溃
报错根因
这个崩溃和OutputStream逻辑无关,java.lang.SecurityException: Permission denied (missing INTERNET permission?)是Android系统拦截了未授权的网络请求,说明你的应用没有声明网络访问权限。
修复步骤
声明网络权限
打开项目中的AndroidManifest.xml,在<manifest>节点下、<application>节点的平级位置添加以下权限声明:<uses-permission android:name="android.permission.INTERNET" />该权限属于安装时自动授予的普通权限,不需要额外编写动态申请代码。
适配高版本系统的网络限制
如果项目targetSdkVersion>= 28,且你的接口地址是http开头的明文请求,需要在<application>标签上添加android:usesCleartextTraffic="true"属性,否则系统会默认拦截明文HTTP请求。如果接口是https开头可以跳过这一步。修正现有代码的逻辑错误
你当前的网络请求代码本身存在几处问题,即使权限加了也可能出现请求异常,一并修正即可:- 重复调用了两次
http.getOutputStream(),第一次获取的ops流没有被使用,属于冗余代码 - 表单参数拼接错误使用了
&&作为分隔符,标准表单参数之间仅需要单个& - 没有设置表单请求的Content-Type头,部分服务端会无法正确解析参数
- 没有调用获取响应码/读取响应的逻辑,连接不会正常完成请求流程
- 两个传参的key都写了
visible,服务端读取时后一个值会覆盖前一个,如果是两个不同参数请修改为不同的key名
修正后的参考代码:
try { URL url = new URL(connstring); HttpURLConnection http = (HttpURLConnection) url.openConnection(); http.setRequestMethod("POST"); http.setDoInput(true); http.setDoOutput(true); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); OutputStream ops = http.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(ops, "UTF-8")); String data = URLEncoder.encode("visible", "UTF-8") + "=" + URLEncoder.encode(visible, "UTF-8") + "&" + URLEncoder.encode("option", "UTF-8") + "=" + URLEncoder.encode(option, "UTF-8"); writer.write(data); writer.flush(); writer.close(); ops.close(); // 触发请求实际发送,获取响应状态码 int responseCode = http.getResponseCode(); // 后续可在这里读取服务端返回的输入流内容 } catch (MalformedURLException ex) { result = ex.getMessage(); } catch (IOException e) { result = e.getMessage(); }- 重复调用了两次
内容的提问来源于stack exchange,提问作者user18974397
相关产品推荐
相关产品推荐

