@SystemApi
, @PrivateApi
i @hide
Według this commit, @SystemApi
jest zmiana nazwy starego @PrivateApi
. Interfejsy API oznaczone jako @hide
niekoniecznie są @SystemApi
, ale @SystemApi
wymaga @hide
.
Aby uzyskać więcej informacji o @hide
, adnotacja javadoc, this post daje dobrą odpowiedź.
Bazując na własnych doświadczeniach, jeden (aplikacja non-System) można nadal uzyskać dostęp @hide
API i pól użyciu odbicia Java podobne (z this post):
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration config = new WifiConfiguration();
config.SSID = "AccessPointSSID";
Method method = manager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(manager, config, true);
Ale próby dostępu @SystemApi
rzeczy przy użyciu odbicia Java jest niemożliwe (Poniższy kod wywoła invocationTargetException
):
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method method = manager.getClass().getMethod("getPrivilegedConfiguredNetworks");
List<WifiConfiguration> configs = (List<WifiConfiguration>)method.invoke(manager);
P.S.
W WifiManager
java code, API setWifiApEnabled
i getPrivilegedConfiguredNetworks
są zdefiniowane jako:
/**
* Start AccessPoint mode with the specified
* configuration. If the radio is already running in
* AP mode, update the new configuration
* Note that starting in access point mode disables station
* mode operation
* @param wifiConfig SSID, security and channel details as
* part of WifiConfiguration
* @return {@code true} if the operation succeeds, {@code false} otherwise
*
* @hide Dont open up yet
*/
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
try {
mService.setWifiApEnabled(wifiConfig, enabled);
return true;
} catch (RemoteException e) {
return false;
}
}
i
/** @hide */
@SystemApi
public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
try {
return mService.getPrivilegedConfiguredNetworks();
} catch (RemoteException e) {
return null;
}
}
Dzięki za wyjaśnienie! W moich testach większość interfejsów API z adnotacjami '@ SystemApi' i' @ hide' (poprzednio opatrzonych adnotacją "@ hide") jest nadal dostępna poprzez odbicie. Jaka jest szczegółowa wiadomość 'InvocationTargetException' w twoim przypadku? –
Zrobiłem eksperyment na moim Nexusie 5 z Androidem 5.0. @ Oasis-feng Przypuszczam, że zachowanie '@ SystemApi' jest związane z wersją? –
Testowałem również na Nexusie 5 z Androidem 5.0.2. Może różni się od API do API. Czy możesz wkleić szczegółową wiadomość z InvocationTargetException? –