在 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(); } }
限制:
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 拦截 | 不可靠 | 不可靠 | 需要 | 不需要 |
跳转系统设置 | 可用 | 可用 | 不需要 | 需要 |
解答:
通过 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();
解答:
通过 ConnectivityManager
的 NetworkRequest
设置网络偏好:
NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkPreference(NetworkPreference.WIFI) // 优先使用 Wi-Fi .build(); cm.requestNetwork(request, new ConnectivityManager.NetworkCallback() {});
注意:此方法仅能设置网络优先级,无法直接禁用移动网络