当前位置:首页 > 行业动态 > 正文

安卓开发关闭移动网络连接

在Android中关闭移动网络需通过ConnectivityManager配合系统权限,使用反射调用setMobileDataEnabled(false),需声明MODIFY_PHONE_STATE权限(需系统级授权

权限配置

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

注意MODIFY_PHONE_STATE 是系统级权限,普通应用无法直接获取,需通过特殊方式(如系统签名)或间接实现。


关闭移动网络的实现方法

通过 TelephonyManager 和反射(适用于 Android 10 以下)

import android.telephony.TelephonyManager;
import java.lang.reflect.Method;
public void disableMobileNetwork(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    try {
        Method setDataEnabledMethod = TelephonyManager.class.getDeclaredMethod("setDataEnabled", boolean.class);
        setDataEnabledMethod.invoke(telephonyManager, false); // 关闭移动网络
    } catch (Exception e) {
        e.printStackTrace();
    }
}

限制

安卓开发关闭移动网络连接

  • Android 10(API 29)及以上版本禁止通过反射修改网络状态。
  • 需要 MODIFY_PHONE_STATE 权限(普通应用无法获取)。

通过 ConnectivityManager 设置网络禁用(需系统权限)

import android.net.ConnectivityManager;
import android.net.NetworkRequest;
public void blockMobileNetwork(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest request = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();
    cm.unregisterNetworkCallback(new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            // 网络可用时阻止连接
        }
    });
}

限制

  • 仅能拦截网络请求,无法直接关闭移动网络。
  • 需要系统级权限(普通应用不可用)。

引导用户手动关闭(通用方法)

import android.content.Intent;
public void openMobileNetworkSettings() {
    Intent intent = new Intent(Settings.ACTION_DATA_USAGE_SETTINGS);
    context.startActivity(intent);
}

说明:通过跳转到系统设置页面,提示用户手动关闭移动网络,此方法无需特殊权限,但依赖用户操作。

安卓开发关闭移动网络连接


不同安卓版本的限制对比

方法 Android 9及以下 Android 10+ 是否需要系统权限 是否依赖用户操作
反射修改网络状态 可用 禁止 需要 不需要
ConnectivityManager 拦截 不可靠 不可靠 需要 不需要
跳转系统设置 可用 可用 不需要 需要

常见问题与解答

问题 1:如何检测移动网络是否已关闭?

解答
通过 TelephonyManagerConnectivityManager 判断网络状态:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
boolean isMobileEnabled = tm.getDataState() == TelephonyManager.DATA_CONNECTED;

或使用 ConnectivityManager 检查网络类型:

安卓开发关闭移动网络连接

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileEnabled = networkInfo != null && networkInfo.isConnected();

问题 2:如何动态切换移动网络和 Wi-Fi?

解答
通过 ConnectivityManagerNetworkRequest 设置网络偏好:

NetworkRequest request = new NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkPreference(NetworkPreference.WIFI) // 优先使用 Wi-Fi
    .build();
cm.requestNetwork(request, new ConnectivityManager.NetworkCallback() {});

注意:此方法仅能设置网络优先级,无法直接禁用移动网络