以编程方式切换移动数据

时间:2015-02-13 16:05:06

标签: android

我有一种启用或禁用移动数据的方法

public void toggleMobileData(boolean enabled){
        try {
            final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final Class conmanClass = Class.forName(conman.getClass().getName());
            final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
            iConnectivityManagerField.setAccessible(true);
            final Object iConnectivityManager = iConnectivityManagerField.get(conman);
            final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
            final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
            setMobileDataEnabledMethod.setAccessible(true);

            setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
        }catch (Exception e){
            e.printStackTrace();
            Toast.makeText(context.getApplicationContext(),context.getResources().getString(R.string.no_change_ntework),Toast.LENGTH_SHORT).show();
        }
    }

它工作正常,但我尝试使用三星S5并且我收到此错误:

02-13 17:00:59.680    1928-1928/com.app.innergy W/System.err﹕ java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at java.lang.Class.getDeclaredMethod(Class.java:635)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at com.app.innergy.SystemManager.toggleMobileData(SystemManager.java:122)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at com.app.innergy.SingleOptionAdapter$2.onClick(SingleOptionAdapter.java:138)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.view.View.performClick(View.java:5162)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.widget.CompoundButton.performClick(CompoundButton.java:128)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.view.View$PerformClick.run(View.java:20873)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.os.Looper.loop(Looper.java:145)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5834)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
02-13 17:00:59.690    1928-1928/com.app.innergy W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

编辑:这是我调用方法的地方(来自片段中自定义列表视图的适配器,我没有发布所有代码,因为它太长了我猜)

//...

if (soa.getTitle().equals(activity.getResources().getString(R.string.mobile_data))) {
                            fileContent = !soa.isToggle() ? activity.getResources().getString(R.string.activated) : activity.getResources().getString(R.string.deactivated);
                            systemManager.toggleMobileData(!soa.isToggle());
                            soa.setToggle(!soa.isToggle());
                            fileManager.createFile();
                            fileManager.writeToFile(activity.getResources().getString(R.string.mobile_data)+": "+ fileContent);
//...

1 个答案:

答案 0 :(得分:1)

这个问题是重复的,但没有真正的答案(你已经从下面的相同链接获得了你的代码)。大多数这些热门答案都通过反思成功关闭了移动数据:

https://stackoverflow.com/a/12535246/950427

https://stackoverflow.com/a/11555457/950427

由于Android API不支持此功能,因此无法保证通过Reflection使其适用于所有设备。