Има ли начин за достъп до android .net.EthernetManager в приложение за Android? И Class.forName("android.net.ethernet.EthernetManager"), и Class.forName("android.net.EthernetManager") генерират ClassNotFoundException.
Има ли начин за достъп до android.net.EthernetManager в приложение за Android?
Отговори (2)
Изглежда, че android.net.EthernetManager
е скрит клас, маркиран като @hide
от Javadoc. Можете да получите достъп до него, като използвате персонализирана SDK платформа, която е направена тук, и не няма нужда да руутвате устройството.
Библиотеката на Android Hidden API е модифициран jar файл, който комбинира android.jar
от Android SDK с framework.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 свързаност чрез програмно (Android) ( Руутнато устройство)