核心概念:网络权限的演变
-
Android 9 (API 28) 及以下版本:
(图片来源网络,侵删)- 只需在
AndroidManifest.xml中声明<uses-permission>即可。 - 默认情况下,应用可以使用明文流量(如 HTTP),但强烈不推荐。
- 只需在
-
Android 10 (API 29) 及以上版本:
- 强制要求:必须在
AndroidManifest.xml中声明<uses-permission>。 - 默认限制:默认情况下,应用只能使用加密流量(HTTPS),尝试使用 HTTP 请求会失败。
- 例外情况:如果你确实需要使用明文流量(如连接某些老旧的设备或服务器),你必须在
AndroidManifest.xml中添加android:usesCleartextTraffic="true"到<application>标签中。但请注意,这会降低应用的安全性,应尽量避免。
- 强制要求:必须在
-
Android 11 (API 30) 及以上版本:
- 在 Android 10 的基础上,引入了网络安全配置 的概念,这是最推荐、最灵活的方式。
- 你可以通过创建一个 XML 文件来精确地定义你的网络策略,
- 允许所有 HTTPS 流量(默认)。
- 允许特定的 HTTP 域名(比全局开启更安全)。
- 禁用不安全的协议(如 SSLv3, TLSv1.0)。
- 信任特定的证书或证书颁发机构。
在 AndroidManifest.xml 中声明权限
这是所有版本都必须做的第一步,打开你项目的 注意:这个权限是普通权限,不需要用户在运行时手动授权。 根据你的 如果你的应用最低兼容到比较老的系统,或者你暂时不想处理新版本的限制,这种方式最简单。 特点:可以直接使用 如果你的应用需要兼容 Android 10 及以上版本,并且你只需要使用 HTTPS,那么什么都不用额外做!系统默认允许 HTTPS 流量。 特点:你的网络请求代码(使用 OkHttp、Retrofit 等)如果只连接 如果你必须使用 HTTP,则需要额外配置: 警告: 这是最安全、最灵活、最被 Google 推荐的方式,通过创建网络安全配置文件,你可以精确控制哪些网络连接是允许的。 步骤 1:创建网络安全配置文件 在 文件解释: 步骤 2:在 修改 特点: 最终建议:app/src/main/AndroidManifest.xml 文件,在 <manifest> 标签内添加 <uses-permission>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<!--
添加网络权限。
name="android.permission.INTERNET" 是固定的权限字符串。
-->
<uses-permission android:name="android.permission.INTERNET" />
<application
... >
...
</application>
</manifest>
处理不同 Android 版本的网络请求方式
targetSdkVersion(目标 API 版本),你需要采取不同的策略。
targetSdkVersion 低于 29 (Android 9)AndroidManifest.xml<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
...
</application>
</manifest>
HttpURLConnection 或第三方库(如 OkHttp)发起 HTTP 或 HTTPS 请求,但强烈建议你只使用 HTTPS。
targetSdkVersion 为 29 或更高 (Android 10+)
AndroidManifest.xml<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
...
</application>
</manifest>
https:// 开头的地址,将完全正常。AndroidManifest.xml<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true" <!-- 添加这一行 -->
... >
...
</application>
</manifest>
android:usesCleartextTraffic="true" 会让你的应用允许所有明文网络流量,存在中间人攻击等安全风险,请仅在万不得已的情况下使用。
targetSdkVersion 为 29 或更高,并推荐使用(Android 10+)res 目录下新建一个 xml 文件夹(如果不存在),然后创建一个名为 network_security_config.xml 的文件。app/src/main/res/xml/network_security_config.xml<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 基础配置,应用于整个应用 -->
<base-config cleartextTrafficPermitted="false">
<!-- 禁用不安全的协议 -->
<trust-anchors>
<certificates src="system" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
<!-- 可选:为特定域名配置例外规则 -->
<domain-config>
<!-- 允许连接到这个特定的 HTTP 域名 -->
<domain includeSubdomains="true">example.com</domain>
<!-- 允许连接到这个特定的 HTTPS 域名 -->
<domain includeSubdomains="true">api.secure-service.com</domain>
</domain-config>
</network-security-config>
<base-config>: 应用于应用中所有域名的默认配置。
cleartextTrafficPermitted="false": 默认禁止所有 HTTP 流量,这是安全的关键。<domain-config>: 为特定域名设置例外规则。
<domain>: 指定一个域名。includeSubdomains="true": 是否将该规则应用于该域名的所有子域名。<domain-config> 中,默认允许 HTTPS,如果你要允许 HTTP,需要在 <base-config> 中设置 cleartextTrafficPermitted="true",或者更精细地,为该域名创建一个 <domain-config> 并在其中设置 <base-config cleartextTrafficPermitted="true">,但通常只允许特定的 HTTPS 域名更安全。AndroidManifest.xml 中引用该配置文件AndroidManifest.xml 中的 <application> 标签,添加 android:networkSecurityConfig 属性。AndroidManifest.xml<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
总结与最佳实践
目标 API 版本 (
targetSdkVersion)推荐做法
AndroidManifest.xml 配置
< 29 (Android 9)
仅声明权限,使用 HTTPS
<uses-permission android:name="android.permission.INTERNET" />
>= 29 (Android 10+)
推荐:使用网络安全配置
<uses-permission ... /> + android:networkSecurityConfig="@xml/..."
>= 29 (Android 10+)
不推荐:全局允许 HTTP
<uses-permission ... /> + android:usesCleartextTraffic="true"
AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.INTERNET" />。targetSdkVersion 是 29 或更高,请采用“网络安全配置”的方式。network_security_config.xml 中,设置 <base-config cleartextTrafficPermitted="false" /> 来默认禁止 HTTP 流量。
