睿诚科技协会

Android如何添加网络权限?

核心概念:网络权限的演变

  1. Android 9 (API 28) 及以下版本

    Android如何添加网络权限?-图1
    (图片来源网络,侵删)
    • 只需在 AndroidManifest.xml 中声明 <uses-permission> 即可。
    • 默认情况下,应用可以使用明文流量(如 HTTP),但强烈不推荐
  2. Android 10 (API 29) 及以上版本

    • 强制要求:必须在 AndroidManifest.xml 中声明 <uses-permission>
    • 默认限制:默认情况下,应用只能使用加密流量(HTTPS),尝试使用 HTTP 请求会失败。
    • 例外情况:如果你确实需要使用明文流量(如连接某些老旧的设备或服务器),你必须在 AndroidManifest.xml 中添加 android:usesCleartextTraffic="true"<application> 标签中。但请注意,这会降低应用的安全性,应尽量避免。
  3. Android 11 (API 30) 及以上版本

    • 在 Android 10 的基础上,引入了网络安全配置 的概念,这是最推荐、最灵活的方式。
    • 你可以通过创建一个 XML 文件来精确地定义你的网络策略,
      • 允许所有 HTTPS 流量(默认)。
      • 允许特定的 HTTP 域名(比全局开启更安全)。
      • 禁用不安全的协议(如 SSLv3, TLSv1.0)。
      • 信任特定的证书或证书颁发机构。

AndroidManifest.xml 中声明权限

这是所有版本都必须做的第一步,打开你项目的 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 版本),你需要采取不同的策略。

Android如何添加网络权限?-图2
(图片来源网络,侵删)

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+)

如果你的应用需要兼容 Android 10 及以上版本,并且你只需要使用 HTTPS,那么什么都不用额外做!系统默认允许 HTTPS 流量。

Android如何添加网络权限?-图3
(图片来源网络,侵删)

AndroidManifest.xml

<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application ...>
        ...
    </application>
</manifest>

特点:你的网络请求代码(使用 OkHttp、Retrofit 等)如果只连接 https:// 开头的地址,将完全正常。

如果你必须使用 HTTP,则需要额外配置:

AndroidManifest.xml

<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"  <!-- 添加这一行 -->
        ... >
        ...
    </application>
</manifest>

警告android:usesCleartextTraffic="true" 会让你的应用允许所有明文网络流量,存在中间人攻击等安全风险,请仅在万不得已的情况下使用。


targetSdkVersion 为 29 或更高,并推荐使用(Android 10+)

这是最安全、最灵活、最被 Google 推荐的方式,通过创建网络安全配置文件,你可以精确控制哪些网络连接是允许的。

步骤 1:创建网络安全配置文件

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 域名更安全。

步骤 2:在 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>

特点

  • 安全性高:默认只允许 HTTPS,你可以精确地、有选择地允许必要的 HTTP 连接。
  • 灵活性高:可以配置证书锁定、信任用户证书等高级安全策略。
  • 符合 Google 最新要求:是处理网络权限的现代标准。

总结与最佳实践

目标 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"

最终建议:

  1. 始终在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.INTERNET" />
  2. 如果你的 targetSdkVersion 是 29 或更高,请采用“网络安全配置”的方式。
  3. network_security_config.xml 中,设置 <base-config cleartextTrafficPermitted="false" /> 来默认禁止 HTTP 流量。
  4. 仅在绝对必要时,才为特定的、受信任的域名添加允许 HTTP 的例外规则。
  5. 确保你的服务器端支持 HTTPS,这是现代应用开发的基本要求。
分享:
扫描分享到社交APP
上一篇
下一篇