Есть ли способ получить доступ к android? .net.EthernetManager в приложении для Android? И Class.forName("android.net.ethernet.EthernetManager"), и Class.forName("android.net.EthernetManager") генерируют исключение ClassNotFoundException.
Есть ли способ получить доступ к android.net.EthernetManager в приложении для Android?
Ответы (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 и выше.
IPackageManager#getPermissionFlags()
заменяется на IPermissionManager#getPermissionFlags()
в SDK 30. Таким образом, при нацеливании на SDK 30 первый недоступен, и компилятор выдает symbol not found
. Есть ли какой-либо другой способ, кроме 1) reflection
или 2) модифицированного android.jar
, который мы можем выбрать для доступа к скрытым API?
- person Irfan Latif; 28.12.2020
getPermissionFlags()
. Отражение Java можно использовать в такой динамической ситуации. @ИрфанЛатиф
- person Anggrayudi H; 28.12.2020
getPermissionFlags()
в IPackageManager.class
(которая представляет собой интерфейс AIDL для PackageManagerService
) в android.jar
, и ошибок компиляции больше не было. Но у вас есть хороший опыт в этом. Так что я подумал, может быть, у вас есть и третья идея. В любом случае спасибо за ответ.
- person Irfan Latif; 28.12.2020
IIRC вы можете сделать это, только если ваше устройство рутировано.
Здесь есть хорошее объяснение: Ethernet Connectivity через Programmatically (Android) ( Устройство с root-доступом)