我有一种启用或禁用移动数据的方法
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);
//...
答案 0 :(得分:1)
这个问题是重复的,但没有真正的答案(你已经从下面的相同链接获得了你的代码)。大多数这些热门答案都通过反思成功关闭了移动数据:
https://stackoverflow.com/a/12535246/950427
和
https://stackoverflow.com/a/11555457/950427
由于Android API不支持此功能,因此无法保证通过Reflection
使其适用于所有设备。