ACCESS_NETWORK_STATE
和
CHANGE_NETWORK_STATE
权限,并通过
ConnectivityManager
管理网络,启用移动数据需系统权限(如
MODIFY_PHONE_STATE
),普通应用无法直接操作,可引导用户至系统设置页面手动
在安卓应用中操作网络前,必须在AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
注意:Android 6.0+系统需动态申请运行时权限(如ACCESS_NETWORK_STATE
通常不需要,但涉及其他敏感权限时需处理)。
在发起网络请求前,建议检查设备网络状态,避免无效操作:
public boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); }
返回值 | 含义 |
---|---|
true |
网络已连接(WiFi/移动数据) |
false |
无网络连接 |
HttpURLConnection
发起请求public String getRequest(String urlString) throws IOException { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 设置请求方法 connection.setConnectTimeout(5000); // 连接超时(毫秒) connection.setReadTimeout(5000); // 读取超时(毫秒) int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); return response.toString(); } else { throw new IOException("HTTP Error: " + responseCode); } }
new Thread(() -> { try { String result = getRequest("https://api.example.com/data"); // 在UI线程更新结果(需配合Handler或LiveData) } catch (IOException e) { e.printStackTrace(); } }).start();
若需信任自签名证书或忽略SSL验证(不推荐生产环境使用):
// 信任所有证书(仅用于测试) TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
问题 | 解决方案 |
---|---|
权限被拒绝 | 确保在AndroidManifest.xml 声明INTERNET 权限,并在运行时动态申请(如需) |
网络不可用 | 调用isNetworkAvailable() 方法检查网络状态 |
HTTPS证书错误 | 配置正确的SSL证书或临时信任所有证书(仅限测试) |
解答:通过ConnectivityManager
获取网络类型:
public String getNetworkType(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo == null) return "无网络"; if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) return "WiFi"; if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) return "移动数据"; return "未知"; }
解答:设置超时参数并捕获异常,结合重试机制:
public String getRequestWithRetry(String url, int maxRetries) { int attempts = 0; while (attempts < maxRetries) { try { return getRequest(url); // 调用之前的GET请求方法 } catch (IOException e) { attempts++; if (attempts >= maxRetries) throw e; // 超过最大重试次数则抛出异常 } } return null; }