上一篇
安卓开发关闭移动网络连接
- 行业动态
- 2025-04-22
- 5
在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:如何检测移动网络是否已关闭?
解答:
通过 TelephonyManager
或 ConnectivityManager
判断网络状态:
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?
解答:
通过 ConnectivityManager
的 NetworkRequest
设置网络偏好:
NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkPreference(NetworkPreference.WIFI) // 优先使用 Wi-Fi .build(); cm.requestNetwork(request, new ConnectivityManager.NetworkCallback() {});
注意:此方法仅能设置网络优先级,无法直接禁用移动网络