Wifi Connect и сокет клиента в одно нажатие кнопки

У меня есть 2 кнопки в моем приложении.

кнопка 1: подключить Wi-Fi кнопка 2: создать клиентский сокет

с отдельными 2 кнопками эта функциональность работает.

void WifiConnect() { String networkSSID = "HI-LINK_DA79"; String networkPass = "12345678"; WifiConfiguration conf = new WifiConfiguration(); conf.SSID = "\"" + networkSSID + "\""; //ssid must be in quotes conf.preSharedKey = "\""+ networkPass +"\"";

    WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE); 
    int  r1 =-1;
     r1= wifiManager.addNetwork(conf);
     Log.d("Client", "add Network returned " + r1 );

    boolean b = wifiManager.enableNetwork(r1, true);        
    Log.d("Client", "enableNetwork returned " + b );

    boolean d= wifiManager.reconnect();
   Log.d("Client", "wifiManager.reconnect() returned " + d )


}

`Button.OnClickListener buttonWifiConnectOnClickListener = new Button.OnClickListener () {

    public void onClick(View v) {

    WifiConnect();


    }
};

Button.OnClickListener buttonConnectOnClickListener = new Button.OnClickListener () {

    public void onClick(View v) {

        if (socket == null) { 
            Log.i("Client", "socket():Creating --");
            new Thread(new ClientThread()).start();
            //connect.setText("Disconnect");
        }
        else
        {
        try {
            socket.close();
            socket=null;
            Log.i("Client", "socket():closed --");
        //  connect.setText("Connect");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }


    }
};

`

Но это не сработает, если я объединю их одним нажатием кнопки. Button.OnClickListener buttonConnectOnClickListener = new Button.OnClickListener () {

    public void onClick(View v) {

        WifiConnect();    //WiFi connect

        if (socket == null) { 
            Log.i("Client", "socket():Creating --");
            new Thread(new ClientThread()).start();
            //connect.setText("Disconnect");
        }
        else
        {
        try {
            socket.close();
            socket=null;
            Log.i("Client", "socket():closed --");
        //  connect.setText("Connect");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }


    }
};

`

похоже мой поток для создания сокета здесь не вызывается, не знаю почему.

1 ответ

Решение

Если вы хотите, чтобы обе операции выполнялись одним нажатием кнопки, добавьте BroadcastReceiver для прослушивания состояния соединения Wi-Fi, как показано ниже. & в onReceive() метод сделать сокет соединения. Ваше сокет-соединение не работает, когда вы нажимаете одну и ту же кнопку, потому что Wifi-соединение требует времени и без первого соединения Wifi-сокета, поэтому может возникнуть исключение.

Проверка, включен ли Wi-Fi, не обязательно означает, что он подключен. Это просто означает, что режим Wi-Fi на телефоне включен и может подключаться к сетям Wi-Fi.

Вот как прослушивать фактические соединения Wi-Fi в Broadcast Receiver:

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {     
        ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo netInfo = conMan.getActiveNetworkInfo();
        if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            Log.d("WifiReceiver", "Have Wifi Connection");
                    //If connected do socket connection here
            }
        else
            Log.d("WifiReceiver", "Don't have Wifi Connection");    
    }   
};

Чтобы получить доступ к информации об активной сети, вам нужно добавить следующее разрешение на использование в ваш AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

И следующий получатель намерений (или вы можете добавить это программно...)

<!-- Receive Wi-Fi connection state changes -->
<receiver android:name=".WifiReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

& убедитесь, что сетевая активность выполняется в другом потоке, кроме основного потока. Также вам придется зарегистрироваться и отменить регистрацию BroadcastReceiver соответственно. Не забудьте отменить регистрацию, когда она не нужна.

Другие вопросы по тегам