Я зарегистрировал Issue 78084 с Google в отношении метода setMobileDataEnabled()
, который больше не может быть вызван посредством отражения. Это было вызвано с Android 2.1 (API 7) до Android 4.4 (API 19) через отражение, но с Android L и более поздних версий, даже с помощью root, метод setMobileDataEnabled()
не может быть вызван.
Официальный ответ заключается в том, что проблема "Закрыта" и статус установлен на "WorkingAsIntended". Простое объяснение Google:
Частные API являются частными, потому что они нестабильны и могут исчезнуть без уведомления.
Да, Google, мы осознаем риск использования рефлексии для вызова скрытого метода - даже до того, как Android появился на сцене, - но вам нужно предоставить более солидный ответ на альтернативы, если таковые имеются, для достижения того же результата как setMobileDataEnabled()
. (Если вы недовольны решением Google, как и я, войдите в Issue 78084 и запустите его как можно больше, чтобы сообщить Google об ошибке их пути.)
Итак, мой вопрос к вам: мы в тупике, когда речь идет о программном включении или отключении функции мобильной сети на устройстве Android? Этот жестокий подход от Google каким-то образом не подходит мне. Если у вас есть обходной путь для Android 5.0 (Lollipop) и выше, я хотел бы услышать ваш ответ/обсуждение в этой теме.
Я использовал код ниже, чтобы узнать, доступен ли метод setMobileDataEnabled()
:
final Class<?> conmanClass = Class.forName(context.getSystemService(Context.CONNECTIVITY_SERVICE).getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(context.getSystemService(Context.CONNECTIVITY_SERVICE));
final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method[] methods = iConnectivityManagerClass.getDeclaredMethods();
for (final Method method : methods) {
if (method.toGenericString().contains("set")) {
Log.i("TESTING", "Method: " + method.getName());
}
}
Но это не так.
UPDATE. В настоящее время возможно переключить мобильную сеть, если устройство укоренилось. Однако для не-корневых устройств он все еще является следственным процессом, поскольку универсальный метод переключения мобильной сети отсутствует.