Using a WiFi without Internet Connection

后端 未结 3 477
日久生厌
日久生厌 2020-12-17 03:51

In my app I am connecting to a device that has it\'s own WiFi network. In android 6 and above the system asks me after a few seconds if I want to connect to this network eve

相关标签:
3条回答
  • 2020-12-17 04:09

    Your code looks correct from Marshmallow onwards but be aware that your solution doesn't work in Lollipop (API levels 21 and 22).

    The problem can be because you may being trying to force the app to use the WiFi connection AFTER connecting the WiFi network.

    You need to set the NetworkCallback BEFORE changing to the WiFi network you want to have the communications over WiFi only. This is because once you connected to the desired network onAvailable() will be invoked and the bindProcessToNetwork() will be executed.

    Consider look into my complete solution where I used the same method but also supports Lollipop. I tested it in the Android versions 5.1.1, 6.0, 6.0.1, 7.1.1 and 8.1.0.

    0 讨论(0)
  • 2020-12-17 04:16

    Although as long as the Cellular data is active the device doesn't apear to be connected. If I disable the Cellular data then it works fine.

    I was facing a similar problem. The default solution didn't work for me so I used the bindSocket method from Network class, and apparently it is working just fine. I don't know if this solution applies to your problem, but here's some code:

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = connectivityManager.getAllNetworks();
    for(Network network : networks){
       NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
    
       if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
           wifiNetwork = network; // Grabbing the Network object for later usage
       }
    }
    

    and after the socket:

    if(android.os.Build.VERSION.SDK_INT >= 22) {
       wifiNetwork.bindSocket(socket);
    }
    

    UPDATE: You can use a NetworkCallback to grab the Network object as well.

    NetworkRequest.Builder builder;
    builder = new NetworkRequest.Builder();
    builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
       @Override
       public void onAvailable(Network network) {
          wifiNetwork = network;
       }
    });
    
    0 讨论(0)
  • 2020-12-17 04:19

    For those still attempting to figure this out, based on the

    wifiNetwork.bindSocket(socket)
    

    provided by @MayconPrado

    Yes, that socket variable was declared ahead of time. That answer assumes you are sending UDP or TCP packets over the network.

    The partial but more complete code would look something along the lines of

    val socket = DatagramSocket(somePortNumber)
    wifiNetwork.bindSocket(socket)
    val udpPacket = DatagramPacket(/** args specific to use case **/)
    socket.send(udpPacket)
    

    Would have commented this, but I have never posted to SO, so I have 1 rep ATM.

    0 讨论(0)
提交回复
热议问题