es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo darle mayor prioridad a WiFi que a Ethernet en Android 9.

Estoy trabajando en Android 9 y quiero dar preferencia a WiFi sobre Ethernet.
Intenté darle una prioridad más alta a WiFi que a Ethernet en mi archivo config.xml como se muestra a continuación, pero aún así Ethernet tiene una prioridad más alta.

<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,2,6000,true"</item>
<item>"ethernet,9,9,0,6000,true"</item>
</string-array>

Busqué en línea y encontré que la preferencia de red predeterminada se puede establecer en ConnectivityManager.java. Pero muestra que está obsoleto en la API28.

@Deprecated
public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

Además, getNetworkInfo y startUsingNetworkFeature también están obsoletos.

@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
public NetworkInfo getNetworkInfo(int networkType) {


@Deprecated
public int startUsingNetworkFeature(int networkType, String feature) {

¿Cómo puedo darle una prioridad más alta a WiFi que a Ethernet en Android 9?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como los métodos que has mencionado están obsoletos en la API28, puedes usar el siguiente enfoque en Android 9.

    Puedes utilizar la API de enlace de red, la cual permite dar prioridad a una interfaz de red específica al enlazarla al socket. Esto se puede hacer estableciendo la preferencia de red del socket utilizando el método setNetworkPreference().

    Aquí tienes un ejemplo de cómo puedes dar preferencia al WiFi sobre Ethernet:

    //Crear un nuevo socket y enlazarlo con la interfaz de red deseada
    
    Socket socket = new Socket();
    
    Network wifiNetwork = null;
    
    Network[] allNetworks = connectivityManager.getAllNetworks();
    
    for (Network network : allNetworks) {
    
    NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
    
    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
    
    wifiNetwork = network;
    
    break;
    
    }
    
    }
    
    if (wifiNetwork != null) {
    
    socket.setNetworkPreference(wifiNetwork);
    
    }
    
    //Conectar el socket a un host remoto como un servidor
    
    socket.connect(new InetSocketAddress("example.com", 80));
    
    

    En el código anterior, primero iteramos sobre todas las redes disponibles y luego encontramos la red con la capacidad TRANSPORT_WIFI. Una vez que hemos encontrado la red deseada, enlazamos el nuevo socket a esa red estableciendo su preferencia de red utilizando el método setNetworkPreference().

    Esto asegurará que la interfaz WiFi se utilice preferentemente sobre la interfaz Ethernet para el socket.

    Ten en cuenta que este enfoque solo funcionará para los sockets que crees y no para las solicitudes de red a nivel del sistema.

    Espero que esto ayude a resolver tu problema.

Comments are closed.