睿诚科技协会

Android如何添加网络权限?

第一步:在 AndroidManifest.xml 中添加网络权限

这是最核心的一步,你需要打开你项目中的 app/src/main/AndroidManifest.xml 文件,并在 <manifest> 标签内添加 <uses-permission>

添加基本的网络访问权限

这个权限允许你的应用访问网络,无论是 Wi-Fi 还是移动数据。

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

<manifest> 标签内添加以下代码:

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

代码解释:

  • <uses-permission>:声明你的应用需要某个特定的权限。
  • android:name="android.permission.INTERNET":这是系统定义的访问网络权限的固定名称。

第二步:处理 Android 9 (Pie, API 28) 及以上版本的明文 HTTP 限制

从 Android 9 开始,Google 出于安全考虑,默认禁止应用使用不安全的明文 HTTP 协议进行网络通信,如果你的 App 需要访问的网站是 http 开头的,而不是 https,那么你必须在 AndroidManifest.xml 中显式地声明允许使用明文流量。

<application> 标签内添加 android:usesCleartextTraffic 属性:

Android如何添加网络权限?-图2
(图片来源网络,侵删)
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

代码解释:

  • android:usesCleartextTraffic="true":告诉系统,你的应用允许在网络上发送和接收未加密的流量(即 HTTP 请求),如果你只访问 https 网站,可以省略此属性,或者将其设为 false 以加强安全性。

第三步:在 Android 10 (API 29) 及以上请求精确位置权限(可选)

如果你的应用需要根据网络信息(如 Wi-Fi 或基站)来获取用户的大致位置,那么除了 INTERNET 权限外,你还必须请求 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION 权限,这是 Google 的一项隐私政策要求。

添加位置权限

<manifest> 中添加位置权限:

<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 如果需要基于网络获取大致位置,添加此权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 如果需要 GPS 获取精确位置,添加此权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

在运行时请求权限

由于位置权限是敏感权限,你不能只在 AndroidManifest.xml 中声明就完事了,还必须在代码中运行时向用户请求。

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

Activity 中,你可以这样请求:

// 在 Activity 的某个方法中,onCreate 或一个按钮的点击事件里
private void requestLocationPermission() {
    // 检查是否已经授权
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        // 如果没有授权,则请求权限
        // 第一个参数是 Context
        // 第二个参数是权限数组(可以一次请求多个)
        // 第三个参数是请求码,用于在回调中识别这次请求
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                MY_PERMISSIONS_REQUEST_LOCATION);
    }
}
// 重写 onRequestPermissionsResult 方法来处理用户的授权结果
@Override
public void onRequestPermissionsResult(int requestCode,
        String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_LOCATION: {
            // 如果请求被取消,grantResults 数组为空
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户授权了,可以执行需要位置权限的操作
                // 获取网络位置
            } else {
                // 用户拒绝了,可以提示用户该权限的必要性
                Toast.makeText(this, "需要位置权限才能获取网络信息", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    }
}
// 定义一个常量来作为请求码
private static final int MY_PERMISSIONS_REQUEST_LOCATION = 1;

完整示例

假设你的应用需要访问一个 http 网站并且需要基于网络获取位置,你的 AndroidManifest.xml 文件看起来会是这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <!-- 1. 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 2. 基于网络的位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApp"
        <!-- 3. 允许明文 HTTP 流量 (针对 Android 9+) -->
        android:usesCleartextTraffic="true">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
  1. 基础网络权限:在 AndroidManifest.xml<manifest> 标签下添加 <uses-permission android:name="android.permission.INTERNET" />
  2. 明文 HTTP 支持:如果你的 App 使用 http 协议,在 <application> 标签中添加 android:usesCleartextTraffic="true"
  3. 网络位置权限:如果需要根据网络获取位置,在 <manifest> 下添加 ACCESS_COARSE_LOCATION 权限,并在代码中运行时请求。
  4. HTTPS 优先:出于安全考虑,强烈建议所有网络请求都使用 https 协议,这样可以避免处理明文流量的限制,并保护用户数据安全。
分享:
扫描分享到社交APP
上一篇
下一篇