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.

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); } } 

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.

Fuente: http://developer.android.com/reference/android/net/ConnectivityManager.html#ACTION_CAPTIVE_PORTAL_SIGN_IN

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:

En la vista de depuración de Android Studio, mNetworkSpecifier = null

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 el tiempo de espera predeterminado de java.net.Socket en android?
  • ¿Cómo mantenerse conectado a través de la red móvil después de que WIFI esté conectado en Android?
  • ¿Puedo obtener la dirección IP del punto de acceso a Estoy conectado a través de wifi?
  • Opciones para la comunicación del servidor cliente en Android
  • No se puede acceder a Internet a través de WiFi desde un servicio de fondo
  • Wake lock no parece funcionar
  • ¿Cómo implementar un reinicio de MediaPlayer en errores en Android?
  • Tratando de conectar la aplicación de Android a .NET ".svc" webservice y el servidor responde Tipo de soporte no compatible
  • ¿Por qué no podemos enviar un paquete UDP desde un emulador de Android?
  • Recomendaciones para el desarrollador C # -ish con respecto a transistion suave a Android?
  • Dirección IP del dispositivo que utiliza el teléfono como punto de acceso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.