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