睿诚科技协会

Android网络访问权限如何正确配置与使用?

  1. 为什么需要网络权限?
  2. 新旧版本权限的演变(Android 9 vs. Android 12+)
  3. 如何在 AndroidManifest.xml 中声明权限
  4. 如何在运行时请求权限(针对 Android 12+)
  5. 最佳实践与注意事项

为什么需要网络权限?

在 Android 系统中,出于安全和隐私的考虑,默认情况下,App 是没有权限进行网络访问的,App 试图在没有授权的情况下访问网络,系统会直接抛出安全异常,导致 App 崩溃。

Android网络访问权限如何正确配置与使用?-图1
(图片来源网络,侵删)

我们必须明确地向系统声明:“我的 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 加密。

Android网络访问权限如何正确配置与使用?-图2
(图片来源网络,侵删)
  • 新要求: 如果你的 App 需要访问 HTTPS 流量(这是绝大多数情况),你还需要额外声明一个 usesCleartextTraffic
  • 标签作用: 这个标签告诉系统,你的 App 是否允许在网络上发送或接收未加密的数据流量。
    • android:usesCleartextTraffic="true": 允许 App 使用明流量网络(如 HTTP)。强烈推荐设置为 true,因为即使你主要使用 HTTPS,某些场景(如本地调试、连接旧设备)可能也需要它。
    • android:usesCleartextTraffic="false": 禁止 App 使用明流量网络,强制所有流量都必须是加密的(如 HTTPS)。

从 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 中)访问网络,你可能还需要处理“后台位置权限”,因为很多网络请求会关联到位置信息(根据用户位置提供内容)。

Android网络访问权限如何正确配置与使用?-图3
(图片来源网络,侵删)

对于前台网络访问(即用户正在与 App 交互时发起的网络请求),通常不需要在运行时动态请求权限,你在 AndroidManifest.xml 中的声明已经足够。

什么时候需要运行时请求?

当你需要在后台执行网络任务时,如果该任务依赖于位置信息,你可能需要请求 ACCESS_BACKGROUND_LOCATION 权限,但这不是一个通用的要求,而是特定场景下的需求。

对于纯粹的、不依赖位置的后台网络任务(如下载更新、同步数据),通常只需要在 AndroidManifest.xml 中正确声明即可,系统会允许其在后台执行(但有可能会被系统在内存紧张时限制)。

一个常见的误解:很多人以为 INTERNET 权限像 CAMERAREAD_EXTERNAL_STORAGE 一样,需要在运行时弹出对话框让用户授权。这是不正确的。 INTERNET 权限是一个“安装时权限”,用户在安装 App 时就已经授权了。


最佳实践与注意事项

  1. 始终使用 HTTPS: 在今天,所有网络请求都应通过 HTTPS 进行,它可以保护数据在传输过程中不被窃听或篡改,并且是现代网络功能(如 HTTP/2)的基础。
  2. 正确配置 usesCleartextTraffic: 为了兼容性和稳定性,请始终在 AndroidManifest.xml 中设置 android:usesCleartextTraffic="true",除非你有充分的理由禁止它。
  3. 处理网络状态: 在发起网络请求前,最好检查一下设备的网络连接状态(Wi-Fi 或移动数据是否可用),可以使用 ConnectivityManager 来实现。
  4. 在后台执行网络任务: 如果需要在后台执行网络任务,优先使用 WorkManager,它比 Service 更可靠、更省电,并且能很好地处理系统对后台任务的限制。
  5. 注意流量消耗: 网络访问会产生流量消耗,如果你的 App 流量较大,应考虑为用户提供流量节省模式,或者只在 Wi-Fi 环境下执行某些任务。
权限/配置 作用 适用版本 位置
INTERNET 基础网络访问权限,允许打开网络套接字。 所有版本 AndroidManifest.xml (作为 <uses-permission>)
usesCleartextTraffic 控制是否允许明流量网络,设为 true 可确保 HTTPS 正常工作。 Android 10+ (API 29+) AndroidManifest.xml (作为 <application> 的属性)

要让你的 App 能正常访问网络,你只需要做两件事:

  1. AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.INTERNET" />
  2. AndroidManifest.xml<application> 标签中添加 android:usesCleartextTraffic="true"

完成这两步,你的 App 就具备了访问网络的基本资格,接下来就可以使用 OkHttp, Retrofit, Volley 等网络库进行开发了。

分享:
扫描分享到社交APP
上一篇
下一篇