- 为什么需要网络权限?
- 新旧版本权限的演变(Android 9 vs. Android 12+)
- 如何在
AndroidManifest.xml中声明权限 - 如何在运行时请求权限(针对 Android 12+)
- 最佳实践与注意事项
为什么需要网络权限?
在 Android 系统中,出于安全和隐私的考虑,默认情况下,App 是没有权限进行网络访问的,App 试图在没有授权的情况下访问网络,系统会直接抛出安全异常,导致 App 崩溃。

我们必须明确地向系统声明:“我的 App 需要访问网络,请允许我这样做。”
新旧版本权限的演变
这是理解网络权限最关键的一点,因为它决定了你的代码写法。
A. 针对 Android 9 (Pie, API 28) 及以下版本
在 Android 9 之前,网络权限非常简单,你只需要在 AndroidManifest.xml 中声明一个权限即可。
- 权限名称:
android.permission.INTERNET - 作用: 允许 App 打开网络套接字(Socket),这是进行网络访问的基础。
B. 针对 Android 10 (Q, API 29) 及以上版本
从 Android 10 开始,Google 引入了更严格的网络分区,以增强用户隐私,默认情况下,App 只能访问非加密的明流量网络(如 HTTP),而绝大多数现代网络服务都使用 HTTPS 加密。

- 新要求: 如果你的 App 需要访问 HTTPS 流量(这是绝大多数情况),你还需要额外声明一个
usesCleartextTraffic- 标签作用: 这个标签告诉系统,你的 App 是否允许在网络上发送或接收未加密的数据流量。
android:usesCleartextTraffic="true": 允许 App 使用明流量网络(如 HTTP)。强烈推荐设置为true,因为即使你主要使用 HTTPS,某些场景(如本地调试、连接旧设备)可能也需要它。android:usesCleartextTraffic="false": 禁止 App 使用明流量网络,强制所有流量都必须是加密的(如 HTTPS)。
- 标签作用: 这个标签告诉系统,你的 App 是否允许在网络上发送或接收未加密的数据流量。
从 Android 12 (API 31) 开始,系统默认禁止 App 使用明流量网络。 如果你的 minSdkVersion 是 31 或更高,你必须显式声明 usesCleartextTraffic,并且通常应该设置为 true,除非你百分之百确定你的 App 只连接 HTTPS 服务。
如何在 AndroidManifest.xml 中声明权限
我们将上述内容应用到代码中,打开你项目的 app/src/main/AndroidManifest.xml 文件,在 <application> 标签之前添加以下内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 1. 声明网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 2. 声明是否允许明流量网络 (非常重要!) -->
<!-- 推荐设置为 true,除非你完全确定只使用 HTTPS -->
<application
android:usesCleartextTraffic="true"
... >
...
</application>
</manifest>
代码解释:
<uses-permission android:name="android.permission.INTERNET" />: 这是申请网络权限的“通行证”,告诉系统我需要这个能力。android:usesCleartextTraffic="true": 这是告诉系统“我可以处理明流量数据”,确保 HTTPS 连接能正常工作,并兼容旧设备。
如何在运行时请求权限(针对 Android 12+)
虽然 INTERNET 权限在 AndroidManifest.xml 中声明,但从 Android 10 开始,系统对后台网络访问也有限制,如果你的 App 需要在后台(如 Service 或 WorkManager 中)访问网络,你可能还需要处理“后台位置权限”,因为很多网络请求会关联到位置信息(根据用户位置提供内容)。

对于前台网络访问(即用户正在与 App 交互时发起的网络请求),通常不需要在运行时动态请求权限,你在 AndroidManifest.xml 中的声明已经足够。
什么时候需要运行时请求?
当你需要在后台执行网络任务时,如果该任务依赖于位置信息,你可能需要请求 ACCESS_BACKGROUND_LOCATION 权限,但这不是一个通用的要求,而是特定场景下的需求。
对于纯粹的、不依赖位置的后台网络任务(如下载更新、同步数据),通常只需要在 AndroidManifest.xml 中正确声明即可,系统会允许其在后台执行(但有可能会被系统在内存紧张时限制)。
一个常见的误解:很多人以为 INTERNET 权限像 CAMERA 或 READ_EXTERNAL_STORAGE 一样,需要在运行时弹出对话框让用户授权。这是不正确的。 INTERNET 权限是一个“安装时权限”,用户在安装 App 时就已经授权了。
最佳实践与注意事项
- 始终使用 HTTPS: 在今天,所有网络请求都应通过 HTTPS 进行,它可以保护数据在传输过程中不被窃听或篡改,并且是现代网络功能(如 HTTP/2)的基础。
- 正确配置
usesCleartextTraffic: 为了兼容性和稳定性,请始终在AndroidManifest.xml中设置android:usesCleartextTraffic="true",除非你有充分的理由禁止它。 - 处理网络状态: 在发起网络请求前,最好检查一下设备的网络连接状态(Wi-Fi 或移动数据是否可用),可以使用
ConnectivityManager来实现。 - 在后台执行网络任务: 如果需要在后台执行网络任务,优先使用
WorkManager,它比Service更可靠、更省电,并且能很好地处理系统对后台任务的限制。 - 注意流量消耗: 网络访问会产生流量消耗,如果你的 App 流量较大,应考虑为用户提供流量节省模式,或者只在 Wi-Fi 环境下执行某些任务。
| 权限/配置 | 作用 | 适用版本 | 位置 |
|---|---|---|---|
INTERNET |
基础网络访问权限,允许打开网络套接字。 | 所有版本 | AndroidManifest.xml (作为 <uses-permission>) |
usesCleartextTraffic |
控制是否允许明流量网络,设为 true 可确保 HTTPS 正常工作。 |
Android 10+ (API 29+) | AndroidManifest.xml (作为 <application> 的属性) |
要让你的 App 能正常访问网络,你只需要做两件事:
- 在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET" />。 - 在
AndroidManifest.xml的<application>标签中添加android:usesCleartextTraffic="true"。
完成这两步,你的 App 就具备了访问网络的基本资格,接下来就可以使用 OkHttp, Retrofit, Volley 等网络库进行开发了。
