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
соответственно. Не забудьте отменить регистрацию, когда она не нужна.