以编程方式禁用移动网络

Posted

技术标签:

【中文标题】以编程方式禁用移动网络【英文标题】:Disable mobile network programmatically 【发布时间】:2014-01-09 01:39:48 【问题描述】:

我正在开发一个应用程序,用户可以通过单击按钮启用/禁用移动网络。我对此进行了谷歌搜索,但我只得到了飞行模式的解决方案。在飞行模式下,WI-FI 和蓝牙也被禁用。我不希望他们通过使用飞行模式概念来禁用。我只想禁用移动网络。以编程方式实现它的可能方法是什么?

【问题讨论】:

【参考方案1】:

移动数据是Global setting(以前的安全设置)。根据文档

全局系统设置,包含始终适用的首选项 与所有定义的用户相同。 应用程序可以读取这些但 不允许写;像“安全”设置一样,这些是用于 用户必须通过系统 UI 显式修改的首选项 或用于这些值的专用 API。

不允许应用在没有用户直接参与的情况下更改此设置的原因是为了保护用户免于在恶意应用“决定”在漫游期间或为没有数据统一费率的用户打开移动数据之后支付意外账单。

任何允许更改此设置的现有解决方案都使用反射并利用 android 系统中可能仍然存在于某些手机上的安全漏洞。无论如何,Android 团队对此类漏洞非常重视,他们会在发现安全问题后立即修复。因此,任何今天有效的解决方案明天都会停止工作。我不会依赖他们。

如果您想帮助用户更快地从您的应用程序中切换移动数据,您应该弹出一个系统设置对话框,用户可以在其中自行打开或关闭移动数据。在 Android 4.0 及更高版本中,您可以执行以下操作。

Intent intent = new Intent();
intent.setClassName("com.android.settings",
     "com.android.settings.Settings$DataUsageSummaryActivity");
startActivity(intent);

如果您仍然决定使用“直接切换”,您可以使用此线程中发布的基于反射的解决方案之一。但请注意,它们不会在每部手机上都能正常工作,并且可能会在每次新系统更新后停止工作。

【讨论】:

【参考方案2】:

如果您有root权限,您可以使用此方法禁用移动网络:

try 
    Runtime.getRuntime().exec("su -c svc data disable");
 catch (IOException e) 
    Log.d("Error", e.getMessage());

如果您想启用移动网络,只需将 disable 替换为 enable

【讨论】:

【参考方案3】:

使用以下代码禁用/启用移动网络..

private void setMobileConnectionEnabled(Context context, boolean enabled) 
           final ConnectivityManager mConnectivityManager = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
           final Class mClass = Class.forName(mConnectivityManager.getClass().getName());
           final Field mField = mClass.getDeclaredField("mService");
           mField.setAccessible(true);
           final Object mObject = mField.get(mConnectivityManager);
           final Class mConnectivityManagerClass =  Class.forName(mObject.getClass().getName());
           final Method setMobileDataEnabledMethod = mConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
           setMobileDataEnabledMethod.setAccessible(true);

           setMobileDataEnabledMethod.invoke(mObject, enabled);

您必须在menifest.xml中添加以下权限

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

如果你想禁用整个网络,那么你可以禁用/启用AirplaneMode

【讨论】:

不...我已经在 ma question 中提到使用飞行模式概念,wifi 和蓝牙也会被禁用,但我不想要它... @AnilBhatiya 我不认为这是可能的。甚至 Android 系统都没有在设备中提供。

以上是关于以编程方式禁用移动网络的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式禁用移动 Chrome 43 的“触摸搜索”功能

以编程方式禁用/启用网络接口

如何以编程方式启用/禁用网络接口? (Windows XP)

以编程方式选择 Internet 连接(WiFi、移动宽带……)

如何以编程方式检测是不是在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件)

如何判断“移动网络数据”是启用还是禁用(即使通过 WiFi 连接)?