Android L (5.x) Включает / выключает «Мобильные данные» программно

Мне нужно программно включить / выключить мобильные данные. Ниже код не работает для 5.x. Не могли бы вы мне помочь. Заранее спасибо.

private void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final Class conmanClass = Class.forName(conman.getClass().getName()); final Field connectivityManagerField = conmanClass.getDeclaredField("mService"); connectivityManagerField.setAccessible(true); final Object connectivityManager = connectivityManagerField.get(conman); final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName()); final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(connectivityManager, enabled); } 

03-30 12: 42: 29.466: W / System.err (5966): java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] 03-30 12: 42: 29.466: W / System.err (5966): at java.lang .Class.getMethod (Class.java:664) 03-30 12: 42: 29.466: W / System.err (5966): at java.lang.Class.getDeclaredMethod (Class.java:626)

Java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] @ ниже строки.

Final Метод setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod ("setMobileDataEnabled", Boolean.TYPE);

Похоже, что метод setMobileDataEnabled больше не существует в ConnectivityManager, и эта функция была перенесена в TelephonyManager с помощью двух методов getDataEnabled и setDataEnabled.

 public void setMobileDataState(boolean mobileDataEnabled) { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class); if (null != setMobileDataEnabledMethod) { setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled); } } catch (Exception ex) { Log.e(TAG, "Error setting mobile data state", ex); } } public boolean getMobileDataState() { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled"); if (null != getMobileDataEnabledMethod) { boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService); return mobileDataEnabled; } } catch (Exception ex) { Log.e(TAG, "Error getting mobile data state", ex); } return false; } 

При выполнении кода вы получаете SecurityException, в котором говорится, что ни пользователь 10089, ни текущий процесс не имеет android.permission.MODIFY_PHONE_STATE.

Должно быть добавлено разрешение MODIFY_PHONE_STATE , я получил это от ответа Спасибо Muzikant

В Android L 5.xx скрытый API setMobileDataEnabled метод удаляется, и его больше нельзя использовать. Вы можете проверить это в исходном коде lolipop android в /frameworks/base/core/java/android/net/ConnectivityManager.java.

Если вы все еще настаиваете на его выполнении, вы можете использовать фрагмент кода, ответивший на Kushal, но getDataEnabled – это система api, доступ к которой пользовательские пользовательские приложения не могут получить. Существует также еще одна система api, доступная setDataEnabled в TelephonyManager. (/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)

 /** @hide */ @SystemApi public void setDataEnabled(boolean enable) { setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); } 

Он также нуждается в разрешении «android.permission.MODIFY_PHONE_STATE», который будет работать только на корневых устройствах.

Intereting Posts