Conéctese a wifi sin Internet mediante programación

Estoy usando el siguiente código para conectarse a una red WiFi sin conexión a Internet, ya que aloja su propio servidor web donde quiero conectar incluso si no hay conexión a Internet disponible.

WifiConfiguration wifiConfiguration = new WifiConfiguration(); wifiConfiguration.SSID = String.format("\"%s\"", scanResult.SSID); wifiConfiguration.preSharedKey = String.format("\"%s\"", "secret"); int netId = wifiManager.addNetwork(wifiConfiguration) wifiManager.disconnect(); wifiManager.enableNetwork(netId, true); wifiManager.reconnect(); 

Esto funciona bien en todos los dispositivos de Android Marshmallow (estoy usando CM13, por lo que es posible que se relaciona con CyanogenMod?): Cuando uso este código para conectarse, Android todavía utiliza la conexión móvil y marcar el símbolo WiFi con un signo de exclamación. Segundos después muestra una notificación con la pregunta si quiero permanecer conectado, porque la red no tiene conexión a Internet.

Problema: Mi aplicación intenta conectarse automáticamente a mi servidor web que falla, ya que obviamente no hay conexión a Internet. Por supuesto, sería posible esperar hasta que pueda llegar a mi servidor web, pero debería funcionar sin la interacción del usuario.

¿Cómo soluciona ChromeCast o cualquier otro dispositivo IoT ? Nunca vi una notificación como esta cuando estaba configurando mi dispositivo ChromeCast.

One Solution collect form web for “Conéctese a wifi sin Internet mediante programación”

Resolví esto vinculando ( connectivityManager.bindProcessToNetwork(network); ) el proceso actual a la red conectada. Esto evita que el cuadro de diálogo "siga usando esta red" y le permita comunicarse con el dispositivo a través de wifi.

 NetworkRequest.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder = new NetworkRequest.Builder(); //set the transport type do WIFI builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.RELEASE.equalsIgnoreCase("6.0")) { if (!Settings.System.canWrite(mActivity)) { Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); goToSettings.setData(Uri.parse("package:" + mActivity.getPackageName())); mActivity.startActivity(goToSettings); } } connectivityManager.bindProcessToNetwork(null); if (mSsid.contains("my_iot_device-xxxxxxxxx")) { connectivityManager.bindProcessToNetwork(network); } else { } } else { //This method was deprecated in API level 23 ConnectivityManager.setProcessDefaultNetwork(null); if (mSsid.contains("my_iot_device-xxxxxxxxx")) { ConnectivityManager.setProcessDefaultNetwork(network); } else { } } try { //do a callback or something else to alert your code that it's ok to send the message through socket now } catch (Exception e) { Crashlytics.logException(e); e.printStackTrace(); } connectivityManager.unregisterNetworkCallback(this); } }); } 
  • Wake lock no parece funcionar
  • ¿Cómo compartir programaticamente la pantalla del dispositivo Android con otra vía wifi? (No captura de pantalla)
  • Ruta de las solicitudes de red sólo a través de la conexión de datos móviles
  • Compartir credenciales Wifi a través de etiqueta NFC sin aplicaciones especiales
  • ¿Hay una manera de forzar una conexión de red sobre 4G, incluso cuando WiFi está habilitado y conectado?
  • Configuración de HTTP Proxy para redes WIFI en dispositivos Android 1.xy 2.x
  • Compartir ajustes WiFi como QR-Code para WPA2 Enterprise
  • Wifi triangulación de posición
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.