安卓——WIFI连接
发布日期:2021-06-29 11:11:51 浏览次数:3 分类:技术文章

本文共 12211 字,大约阅读时间需要 40 分钟。

在上一篇博客的基础上展开,

上篇博客已经完成到了,得到wifi列表以及其点击事件,接来下我们的操作就是在listView的点击事件中完成。点击即为连接,则需要输入密码,则需要弹出对话框输入密码,然后将SSID与密码进行WIFI连接操作。
1;获取SSID;
这里写图片描述
2;打开对话框以及获得密码
这里写图片描述
获取对话框搞了好久,之前是用一个类继承的,后来直接闪退,就改成了直接new对象。
3;连接;创建了一个类来进行连接

案例完整代码;

package com.zw.wificonnect;import java.util.List;import com.zw.wificonnect.WifiConnector.WifiCipherType;import android.annotation.SuppressLint;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.Context;import android.content.DialogInterface;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends ActionBarActivity {
private WifiManager wifiManager; private List
list; private ListView listView; private ScanResult result; WifiConnector wac; String ssid = null; String psw = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wac = new WifiConnector(wifiManager); } public void open(View v){ openWifi(); } public void scan(View v){ init(); } /** * 获取wifi管理者来获取附近wifi链表。 */ private void init() { list = wifiManager.getScanResults(); listView = (ListView) findViewById(R.id.listView); if (list == null) { Toast.makeText(this, "wifi未打开!", Toast.LENGTH_LONG).show(); }else { MyAdapter myAdapter = new MyAdapter(this,list); listView.setAdapter(myAdapter); listView.setOnItemClickListener(new OnItemClickListener(){ @SuppressLint("NewApi") @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { ScanResult scanResult = list.get(position); ssid = scanResult.SSID; final EditText et = new EditText(MainActivity.this); new AlertDialog.Builder(MainActivity.this) .setTitle("请输入密码") .setView(et) .setPositiveButton("确定",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog,int which) { psw = et.getText().toString(); wac.connect(ssid, psw,psw.equals("") ?WifiCipherType.WIFICIPHER_NOPASS:WifiCipherType.WIFICIPHER_WPA); //Toast.makeText(getApplicationContext(),et.getText(),Toast.LENGTH_SHORT).show(); } }) .setNegativeButton("取消", null) .setCancelable(false).show(); } }); } } /** * 打开WIFI */ private void openWifi() { if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); } } }
package com.zw.wificonnect;import java.util.List;import android.content.Context;import android.net.wifi.ScanResult;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter{
LayoutInflater inflater; List
list; public MyAdapter(Context context, List
list) { // TODO Auto-generated constructor stub this.inflater = LayoutInflater.from(context); this.list = list; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = null; view = inflater.inflate(R.layout.item_wifi_list, null); //设置item的样式图片; view.setBackgroundResource(R.drawable.msgbox_rec); ScanResult scanResult = list.get(position); TextView textView = (TextView) view.findViewById(R.id.textView); textView.setText(scanResult.SSID); ImageView imageView = (ImageView) view.findViewById(R.id.imageView); //判断信号强度,显示对应的指示图标 if (Math.abs(scanResult.level) > 100) { imageView.setImageResource(R.drawable.wifi_1); } else if (Math.abs(scanResult.level) > 80) { imageView.setImageResource(R.drawable.wifi_2); } else if (Math.abs(scanResult.level) > 70) { imageView.setImageResource(R.drawable.wifi_2); } else if (Math.abs(scanResult.level) > 60) { imageView.setImageResource(R.drawable.wifi_3); } else if (Math.abs(scanResult.level) > 50) { imageView.setImageResource(R.drawable.wifi_3); } else { imageView.setImageResource(R.drawable.wifi_4); } return view; }}
package com.zw.wificonnect;import java.util.List;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiManager;import android.net.wifi.WifiConfiguration.AuthAlgorithm;import android.net.wifi.WifiConfiguration.KeyMgmt;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;public class WifiConnector {
public Handler mHandler; WifiManager wifiManager; /** * 向UI发送消息 * @param info 消息 */ public void sendMsg(String info) { if (mHandler != null) { Message msg = new Message(); msg.obj = info; mHandler.sendMessage(msg);// 向Handler发送消息 } else { Log.e("wifi", info); } } //WIFICIPHER_WEP是WEP ,WIFICIPHER_WPA是WPA,WIFICIPHER_NOPASS没有密码 public enum WifiCipherType { WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID } // 构造函数 public WifiConnector(WifiManager wifiManager) { this.wifiManager = wifiManager; } // 提供一个外部接口,传入要连接的无线网 public void connect(String ssid, String password, WifiCipherType type) { Thread thread = new Thread(new ConnectRunnable(ssid, password, type)); thread.start(); } // 查看以前是否也配置过这个网络 private WifiConfiguration isExsits(String SSID) { List
existingConfigs = wifiManager .getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return existingConfig; } } return null; } private WifiConfiguration createWifiInfo(String SSID, String Password, WifiCipherType Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; // nopass if (Type == WifiCipherType.WIFICIPHER_NOPASS) { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } // wep if (Type == WifiCipherType.WIFICIPHER_WEP) { if (!TextUtils.isEmpty(Password)) { if (isHexWepKey(Password)) { config.wepKeys[0] = Password; } else { config.wepKeys[0] = "\"" + Password + "\""; } } config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); config.allowedKeyManagement.set(KeyMgmt.NONE); config.wepTxKeyIndex = 0; } // wpa if (Type == WifiCipherType.WIFICIPHER_WPA) { config.preSharedKey = "\"" + Password + "\""; config.hiddenSSID = true; config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.TKIP); // 此处需要修改否则不能自动重联 // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; } // 打开wifi功能 private boolean openWifi() { boolean bRet = true; if (!wifiManager.isWifiEnabled()) { bRet = wifiManager.setWifiEnabled(true); } return bRet; } class ConnectRunnable implements Runnable { private String ssid; private String password; private WifiCipherType type; public ConnectRunnable(String ssid, String password, WifiCipherType type) { this.ssid = ssid; this.password = password; this.type = type; } @Override public void run() { try { // 打开wifi openWifi(); sendMsg("opened"); Thread.sleep(200); // 开启wifi功能需要一段时间(我在手机上测试一般需要1-3秒左右),所以要等到wifi // 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句 while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) { try { // 为了避免程序一直while循环,让它睡个100毫秒检测…… Thread.sleep(100); } catch (InterruptedException ie) { } } WifiConfiguration wifiConfig = createWifiInfo(ssid, password, type); // if (wifiConfig == null) { sendMsg("wifiConfig is null!"); return; } WifiConfiguration tempConfig = isExsits(ssid); if (tempConfig != null) { wifiManager.removeNetwork(tempConfig.networkId); } int netID = wifiManager.addNetwork(wifiConfig); boolean enabled = wifiManager.enableNetwork(netID, true); sendMsg("enableNetwork status enable=" + enabled); boolean connected = wifiManager.reconnect(); sendMsg("enableNetwork connected=" + connected); sendMsg("连接成功!"); } catch (Exception e) { // TODO: handle exception sendMsg(e.getMessage()); e.printStackTrace(); } } } private static boolean isHexWepKey(String wepKey) { final int len = wepKey.length(); // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?) if (len != 10 && len != 26 && len != 58) { return false; } return isHex(wepKey); } private static boolean isHex(String key) { for (int i = key.length() - 1; i >= 0; i--) { final char c = key.charAt(i); if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f')) { return false; } } return true; }}

转载地址:https://blog.csdn.net/zw1996/article/details/75174154 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安卓——关于一些ui界面设置(直续更新ing)
下一篇:安卓——WIFI列表以及点击事件

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月09日 09时15分57秒