Есть ли способ получить доступ к android.net.EthernetManager в приложении для Android?

Есть ли способ получить доступ к android? .net.EthernetManager в приложении для Android? И Class.forName("android.net.ethernet.EthernetManager"), и Class.forName("android.net.EthernetManager") генерируют исключение ClassNotFoundException.


person Hong    schedule 05.02.2016    source источник


Ответы (2)


Кажется, что android.net.EthernetManager - это скрытый класс, отмеченный Javadoc как @hide. Вы можете получить к нему доступ с помощью пользовательской платформы SDK, созданной здесь. не нужно рутировать устройство.

Android Hidden API library – это модифицированный файл jar, который сочетает в себе android.jar из Android SDK с framework.jar из реального устройства. Этот jar-файл позволяет использовать внутренние/скрытые API-интерфейсы Android в процессе разработки.

Что такое внутренние и скрытые API Android? Внутренний API находится в пакете com.android.internal, который доступен в файле framework.jar на реальном устройстве Android, тогда как скрытый API находится в файле android.jar с атрибутом @hide Javadoc. Хотя классы и методы public, но вы не можете получить к ним доступ. Есть красивые методы и ресурсы, которые вы можете использовать из этого пакета. Я предполагаю, что это один API и буду называть его скрытым API. Узнайте больше о скрытом API здесь< /а>.

Итак, посмотрите на эту отметку @hide:

введите здесь описание изображения

Этот класс доступен на уровне API 22 и выше. Но настраиваемый API имеет ограничения. Android Hidden API недоступен для Lollipop 5.1.1 (API 22) и Marshmallow 6.0 (API 23), так как я не могу найти людей, у которых есть это устройство. Если он у вас есть, загрузите framework.jar файл с физического устройства, расположенного в /system/framework/framework.jar, на здесь . буду делать новый!

ДРУГОЕ ОГРАНИЧЕНИЕ

Есть еще одно ограничение Hidden API, которое я пока не объясняю. Когда вы используете некоторые функции, методы, ресурсы или классы с этим скрытым API, которые доступны только на определенном уровне API, ваше приложение может получить к ним доступ только на уровне API соответствующего устройства. Например, вы используете android.net.EthernetManager в своем приложении, вы должны установить цель и скомпилировать SDK на android-22 (поскольку этот класс доступен только на уровне API 22 и выше). После запуска приложения на устройстве с уровнем API 22 и выше ошибка не отображается. Но, как только вы запустите приложение на уровне API 21 и ниже, будет выброшена ошибка, например java.lang.NoClassDefFoundError, потому что класс android.net.EthernetManager создан только для API 22 и выше.

person Anggrayudi H    schedule 05.02.2016
comment
Большое спасибо. Я попробую и завтра отчитаюсь. - person Hong; 05.02.2016
comment
Я только что попробовал. Я получил ошибку: java.lang.NoClassDefFoundError: android.net.EthernetManager. Мне интересно, является ли тестовое устройство API 19, тогда я должен использовать Android-19. Другими словами, если я создам приложение с целевым API 19, это приложение можно будет развернуть ТОЛЬКО на устройствах API 19. Не могли бы вы уточнить это? - person Hong; 05.02.2016
comment
Спасибо. Как узнать, какой API доступен только для какого API? Я не могу понять, что EthernetManager доступен только для API 22 и выше, глядя на код. - person Hong; 07.02.2016
comment
@Hong, просто введите метод, ресурс или класс в поле поиска на jcs.mobile-utopia.com/servlet/. Затем посмотрите на столбец Категория. - person Anggrayudi H; 07.02.2016
comment
Спасибо. Мне интересно, надежен ли этот метод, потому что android.jar библиотеки Android Hidden API для API 21 имеет EthernetManager. Я хочу использовать его для API 17, поэтому мне не повезло. - person Hong; 07.02.2016
comment
Просто мои 5 центов. Использование нескрытых классов — хорошая идея, но это увеличивает ваше приложение на 5 Мб, помните об этом. Мне пришлось отказаться от этого усилия. - person djdance; 03.12.2018
comment
@djdance Вот почему вам нужно уменьшить свой код с помощью ProGuard. - person Anggrayudi H; 05.12.2018
comment
@AnggrayudiH, кажется, вы больше всего обеспокоены скрытыми API-интерфейсами AOSP. Спасибо за вашу работу. // Приведем пример: IPackageManager#getPermissionFlags() заменяется на IPermissionManager#getPermissionFlags() в SDK 30. Таким образом, при нацеливании на SDK 30 первый недоступен, и компилятор выдает symbol not found. Есть ли какой-либо другой способ, кроме 1) reflection или 2) модифицированного android.jar, который мы можем выбрать для доступа к скрытым API? - person Irfan Latif; 28.12.2020
comment
Единственным решением в этом случае является использование отражения и проверка уровня API перед вызовом getPermissionFlags(). Отражение Java можно использовать в такой динамической ситуации. @ИрфанЛатиф - person Anggrayudi H; 28.12.2020
comment
@AnggrayudiH именно это я и делаю. На самом деле оба решения работают. Я добавил заглушку getPermissionFlags() в IPackageManager.class (которая представляет собой интерфейс AIDL для PackageManagerService) в android.jar, и ошибок компиляции больше не было. Но у вас есть хороший опыт в этом. Так что я подумал, может быть, у вас есть и третья идея. В любом случае спасибо за ответ. - person Irfan Latif; 28.12.2020

IIRC вы можете сделать это, только если ваше устройство рутировано.

Здесь есть хорошее объяснение: Ethernet Connectivity через Programmatically (Android) ( Устройство с root-доступом)

person jmorris    schedule 05.02.2016
comment
Спасибо за ответ. Посмотрел пост раньше. Я получаю null для getSystemService (ethernet) на корневом устройстве. - person Hong; 05.02.2016