- 核心概念:为什么需要权限?
- 现代 Android (API 28+) 的关键变化:非加密流量的限制
- 如何正确配置互联网权限
- 网络安全配置
- 最佳实践与总结
核心概念:为什么需要权限?
在 Android 系统中,访问互联网是一个需要特殊权限的敏感操作,原因如下:

- 安全与隐私:防止恶意应用在用户不知情的情况下,偷偷联网、上传个人隐私数据(如联系人、短信、位置)或下载恶意代码。
- 资源消耗:网络连接会消耗移动数据流量和电量,系统需要让用户知道哪些应用在使用这些资源。
- 用户控制:用户有权决定哪些应用可以访问互联网,一个计算器应用就不需要联网权限。
如果你开发的应用需要从服务器获取数据、发送数据、或加载广告,就必须在 AndroidManifest.xml 文件中声明网络访问权限。
现代Android (API 28+) 的关键变化:非加密流量的限制
这是近年来最重要的变化,也是很多开发者容易踩坑的地方。
- 背景:为了提升用户数据的安全性,Google 从 Android 9 (Pie, API 28) 开始,默认禁止应用使用非加密的(即明文的)网络流量。
- 什么是非加密流量? 使用
http://协议的请求就是非加密流量,它的数据在传输过程中是明文,可以被中间人(如公共 Wi-Fi 上的黑客)窃听和篡改。 - 什么是加密流量? 使用
https://协议的请求就是加密流量,它通过 SSL/TLS 协议对数据进行加密,保证了数据传输的机密性和完整性。
这意味着什么?
如果你的应用在 Android 9 及更高版本的设备上,尝试通过 http:// 协议访问网络,请求将会失败,你可能会在 Logcat 中看到类似这样的警告:

W/System.err: javax.net.ssl.SSLHandshakeException: Handshake failed
W/System.err: at ...
...
W/NetworkRequest: The request for <http://your-api.com/data> failed on a cleartext network traffic
如何解决?
最佳解决方案是全面拥抱 HTTPS:
- 后端配置:确保你的服务器支持 HTTPS,并配置了有效的 SSL 证书(如 Let's Encrypt 提供的免费证书)。
- 前端修改:将所有网络请求的 URL 从
http://修改为https://,绝大多数现代网络库(如 Retrofit, OkHttp)会默认使用 HTTPS。
如果你有特殊原因,绝对不推荐,但确实需要临时允许某个域名使用 HTTP,可以通过 网络安全配置 来实现(见第4部分)。
如何正确配置互联网权限
我们来看具体的代码配置,主要有两种权限,根据你的需求选择。

a) INTERNET 权限 (基础权限)
这是最基础的权限,允许应用创建网络套接字(Socket),几乎所有需要联网的应用都需要它。
在 AndroidManifest.xml 中添加:
<manifest ...>
<!-- 声明INTERNET权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
...
</application>
</manifest>
重要提示:仅仅声明 INTERNET 权限,在 Android 9+ 上,如果使用 http://,请求依然会失败,它只是“允许”你访问网络,但不保证你能成功建立连接。
b) ACCESS_NETWORK_STATE 权限 (推荐权限)
这个权限允许你的应用访问网络状态信息,
- 当前网络是否可用。
- 当前是连接的是 Wi-Fi 还是移动数据。
这对于优化用户体验非常有用,你可以在没有网络时显示一个提示,而不是让用户一直等待请求超时。
在 AndroidManifest.xml 中添加:
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<!-- 推荐添加此权限,用于检测网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application ...>
...
</application>
</manifest>
网络安全配置
这是一个高级但非常强大的功能,位于 res/xml/network_security_config.xml 文件中,并在 AndroidManifest.xml 的 <application> 标签中引用。
它允许你灵活地配置应用的网络行为,尤其是在处理 HTTPS 和 HTTP 混合内容或需要信任特定证书时。
场景1:允许特定域名使用 HTTP (不推荐,仅用于特殊或测试环境)
如果你的后端服务暂时无法提供 HTTPS,你可以为特定域名豁免“强制 HTTPS”的规则。
步骤 1:创建 res/xml/network_security_config.xml
<?xml version="1.1" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">your-api.com</domain>
<!-- 如果有多个需要HTTP的域名,可以继续添加 -->
<domain includeSubdomains="false">legacy-api.another-service.com</domain>
</domain-config>
</network-security-config>
cleartextTrafficPermitted="true":允许该域名下的明文流量。<domain>:指定允许的域名。includeSubdomains="true":是否包含所有子域名(如api.your-api.com也被包含)。
步骤 2:在 AndroidManifest.xml 中引用
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
场景2:信任用户安装的证书 (用于企业或私有网络)
在某些企业环境中,网络流量会通过代理进行检测和过滤,这时需要安装由企业颁发的 CA 证书,默认情况下,Android 不信任这些证书,网络安全配置可以让你信任它们。
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<base-config>
<trust-anchors>
<!-- 信任系统预装的证书 -->
<certificates src="system" />
<!-- 信任用户安装的证书 -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
最佳实践与总结
-
首选 HTTPS:这是最重要的一条,从项目一开始就强制使用 HTTPS,并确保你的服务器配置正确,这是保障用户数据和应用安全的基础。
-
声明必要权限:在
AndroidManifest.xml中始终声明android.permission.INTERNET,根据功能,考虑添加ACCESS_NETWORK_STATE来优化用户体验。 -
处理网络状态:不要假设网络总是可用的,在发送请求前,使用
ConnectivityManager检查网络连接状态。// Kotlin 示例:检查网络连接 val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetworkInfo = connectivityManager.activeNetworkInfo if (activeNetworkInfo != null && activeNetworkInfo.isConnected) { // 网络可用,可以发起请求 } else { // 网络不可用,显示提示 } -
在后台执行网络操作:网络请求是耗时操作,绝对不能在主线程(UI线程)中执行,否则会导致应用卡顿甚至弹出
NetworkOnMainThreadException异常,请使用AsyncTask(已废弃)、Thread+Handler,或者更现代的 Kotlin Coroutines 或 RxJava 来处理。 -
网络安全配置要谨慎:只在万不得已时(如对接遗留的 HTTP 服务)才使用
network_security_config.xml来允许明文流量,过度使用会降低应用的安全性。
总结表格
| 权限/配置 | 用途 | 位置 | 备注 |
|---|---|---|---|
INTERNET |
允许应用创建网络连接,进行数据传输 | AndroidManifest.xml |
必须,所有联网应用的基础 |
ACCESS_NETWORK_STATE |
允许应用访问网络状态信息 | AndroidManifest.xml |
推荐,用于检测网络是否可用 |
| 强制 HTTPS | 保证数据传输安全,防止被窃听和篡改 | 服务器配置 + 代码 URL | 强制要求,Android 9+ 默认禁止 HTTP |
network_security_config.xml |
灵活配置网络安全策略,如允许特定 HTTP 域名 | res/xml/,并在 AndroidManifest.xml 中引用 |
高级功能,谨慎使用 |
希望这份详细的指南能帮助你完全理解并正确配置 Android 应用的互联网权限!
