Cómo especificar la red wifi con NetworkRequest.Builder (). SetNetworkSpecifier (string)
Estoy buscando una manera de permitir que una tableta de Android 5.0 se conecte a una intranet que no tiene conexión a Internet por razones de seguridad.
El problema es la protección de portal cautiva que Google construye en android desde 4.4 / 5.0. Se realiza una llamada a conectividad android para comprobar la conexión a Internet, cuando esta llamada falla, la red wifi está marcada como no funcionando y evitada. Bastante cojo.
- No se pudo encontrar la clase SoapObject
- Emulador de Android: ¿Cómo supervisar el tráfico de red?
- El modo de ahorro de energía no causa conexión de red cuando la aplicación vuelve del fondo
- Cómo hacer que una llamada entrante en mi dispositivo móvil active una acción en mi PC
- Acceso dev machine localhost a través de usb
Otros se han encontrado con el mismo problema y algunos sugieren usar una nueva API introducida en android 5, ver: Android 5.0 Lollipop y 4.4 KitKat ignora mi red WiFi, enableNetwork () es inútil
La documentación sobre esto es muy vaga:
NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier)
Por ejemplo, Bluetooth puede usar algún tipo de id de dispositivo mientras que WiFi podría usar ssid y / o bssid.Cellular puede usar carrier spn "
He intentado esto y no funciona. El principal problema es que una vez que uso setNetworkSpecifier()
no se encuentra ninguna red. Intenté usar el bssid
(mac) y el ssid
del AP.
Parece que el filtro está funcionando, pero no está claro cómo debería funcionar. Si dejo de lado la red setNetworkSpecifier()
1 se encuentra, pero no es posible determinar cuál. Por lo menos muestra mis trabajos del código.
Entonces, ¿qué debo poner aquí si ssid y bssid no funciona?
Aquí está mi código.
private void connect(String ssid, Context context) { Log.i(TAG, "try connect to! " + ssid); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI). removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED). removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET setNetworkSpecifier(ssid). //<--- here is the problem build(); ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName()); } } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps()); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName()); } } catch (Exception e) { e.printStackTrace(); } } }; Log.i(TAG, "requestNetwork "); // cm.requestNetwork(nr, callback); cm.registerNetworkCallback(nr, callback); } }
- "Netcfg wlan0 up" No funciona desde la aplicación
- Instagram en el emulador de Android
- Cómo consumir servicio WCF con Android
- Cargar y descargar la tasa de perfil en Android
- ¿Cómo llamar a un servicio web .NET desde android?
- Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
- Supervisión del WiFi en el dispositivo Android
- Red local iOS-Android zeroconf ad-hoc
En primer lugar hacer trampa es siempre una opción y sólo se requiere a la gente a cambiar su configuración en el teléfono para trabajar con la red. La trampa va así. Wifi-> Avanzado-> Desmarcado.
Sin embargo, estoy seguro de que no es la respuesta que está buscando. Así que hice un poco de investigación para usted y encontró lo que se necesitaba. Necesita llamar a un comando ignoreNetwork (). Para obtener más información acerca de este comando, está en ACTION_CAPTIVE_PORTAL_SIGN_IN en el siguiente enlace de origen.
http://developer.android.com/reference/android/net/CaptivePortal.html#ignoreNetwork ()
He depurado el siguiente código que se ejecuta en un Samsung S5 (SM-G900V), API 23 (6.0.1) en Android Studio.
void inspectNetworks() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); Network[] ns = connectivity.getAllNetworks(); for (Network n : ns) { NetworkCapabilities c = connectivity.getNetworkCapabilities(n); Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint } } }
Descubrí que las redes Wi-Fi no tenían ningún networkSpecifier
en absoluto:
Tal vez networkSpecifier
s para WIFI
redes de transporte se llevará a cabo en el futuro … Para el registro, he encontrado que networkSpecifier
se estableció en 1
en este teléfono en particular para ambos existentes CELLULAR
-transport redes.
Por ahora, parece ser lo más específico posible con las llamadas a addCapability
es la mejor opción cuando se solicita una red Wi-Fi.
- ¿Cuál es la mejor estrategia de clave primaria para una aplicación móvil en línea / offline multi-cliente con base de datos SQLite y Azure SQL como almacén central?
- Proyecto de la Biblioteca de Android – Definición de clases