贝博恩创新科技网

android开发互联网权限

  1. 核心概念:为什么需要权限?
  2. 现代 Android (API 28+) 的关键变化:非加密流量的限制
  3. 如何正确配置互联网权限
  4. 网络安全配置
  5. 最佳实践与总结

核心概念:为什么需要权限?

在 Android 系统中,访问互联网是一个需要特殊权限的敏感操作,原因如下:

android开发互联网权限-图1
(图片来源网络,侵删)
  • 安全与隐私:防止恶意应用在用户不知情的情况下,偷偷联网、上传个人隐私数据(如联系人、短信、位置)或下载恶意代码。
  • 资源消耗:网络连接会消耗移动数据流量和电量,系统需要让用户知道哪些应用在使用这些资源。
  • 用户控制:用户有权决定哪些应用可以访问互联网,一个计算器应用就不需要联网权限。

如果你开发的应用需要从服务器获取数据、发送数据、或加载广告,就必须在 AndroidManifest.xml 文件中声明网络访问权限。


现代Android (API 28+) 的关键变化:非加密流量的限制

这是近年来最重要的变化,也是很多开发者容易踩坑的地方。

  • 背景:为了提升用户数据的安全性,Google 从 Android 9 (Pie, API 28) 开始,默认禁止应用使用非加密的(即明文的)网络流量。
  • 什么是非加密流量? 使用 http:// 协议的请求就是非加密流量,它的数据在传输过程中是明文,可以被中间人(如公共 Wi-Fi 上的黑客)窃听和篡改。
  • 什么是加密流量? 使用 https:// 协议的请求就是加密流量,它通过 SSL/TLS 协议对数据进行加密,保证了数据传输的机密性和完整性。

这意味着什么?

如果你的应用在 Android 9 及更高版本的设备上,尝试通过 http:// 协议访问网络,请求将会失败,你可能会在 Logcat 中看到类似这样的警告:

android开发互联网权限-图2
(图片来源网络,侵删)
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

  1. 后端配置:确保你的服务器支持 HTTPS,并配置了有效的 SSL 证书(如 Let's Encrypt 提供的免费证书)。
  2. 前端修改:将所有网络请求的 URL 从 http:// 修改为 https://,绝大多数现代网络库(如 Retrofit, OkHttp)会默认使用 HTTPS。

如果你有特殊原因,绝对不推荐,但确实需要临时允许某个域名使用 HTTP,可以通过 网络安全配置 来实现(见第4部分)。


如何正确配置互联网权限

我们来看具体的代码配置,主要有两种权限,根据你的需求选择。

android开发互联网权限-图3
(图片来源网络,侵删)

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>

最佳实践与总结

  1. 首选 HTTPS:这是最重要的一条,从项目一开始就强制使用 HTTPS,并确保你的服务器配置正确,这是保障用户数据和应用安全的基础。

  2. 声明必要权限:在 AndroidManifest.xml 中始终声明 android.permission.INTERNET,根据功能,考虑添加 ACCESS_NETWORK_STATE 来优化用户体验。

  3. 处理网络状态:不要假设网络总是可用的,在发送请求前,使用 ConnectivityManager 检查网络连接状态。

    // Kotlin 示例:检查网络连接
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetworkInfo = connectivityManager.activeNetworkInfo
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected) {
        // 网络可用,可以发起请求
    } else {
        // 网络不可用,显示提示
    }
  4. 在后台执行网络操作:网络请求是耗时操作,绝对不能在主线程(UI线程)中执行,否则会导致应用卡顿甚至弹出 NetworkOnMainThreadException 异常,请使用 AsyncTask (已废弃)、Thread + Handler,或者更现代的 Kotlin CoroutinesRxJava 来处理。

  5. 网络安全配置要谨慎:只在万不得已时(如对接遗留的 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 应用的互联网权限!

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