以编程方式禁用移动网络

时间:2013-12-20 08:40:05

标签: android telephonymanager

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

3 个答案:

答案 0 :(得分:4)

移动数据是Global setting(以前称为安全设置)。根据文件

  

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

不允许应用在没有用户直接参与的情况下更改此设置的原因是,在恶意应用“决定”在漫游时切换移动数据或没有数据统一费率的用户之后,保护用户免于支付意外账单。< / p>

允许更改此设置的任何现有解决方案都使用反射并利用Android系统中可能仍存在于某些手机上的安全漏洞。在任何情况下,Android团队都非常认真地对待这些漏洞,并且一旦找到它们就会解决安全问题。因此,任何今天工作的解决方案将在明天停止工作。我不会依赖它们。

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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