Android编程实现wifi扫描及连接的方法

作者:迟做总比不做强 时间:2022-11-21 21:11:36 

本文实例讲述了Android编程实现wifi扫描及连接的方法。分享给大家供大家参考,具体如下:

主界面,搜索附近WIFI信息


/**
* Search WIFI and show in ListView
*
*/
public class MainActivity extends Activity implements OnClickListener,
   OnItemClickListener {
 private Button search_btn;
 private ListView wifi_lv;
 private WifiUtils mUtils;
 private List<String> result;
 private ProgressDialog progressdlg = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   mUtils = new WifiUtils(this);
   findViews();
   setLiteners();
 }
 private void findViews() {
   this.search_btn = (Button) findViewById(R.id.search_btn);
   this.wifi_lv = (ListView) findViewById(R.id.wifi_lv);
 }
 private void setLiteners() {
   search_btn.setOnClickListener(this);
   wifi_lv.setOnItemClickListener(this);
 }
 @Override
 public void onClick(View v) {
   if (v.getId() == R.id.search_btn) {
     showDialog();
     new MyAsyncTask().execute();
   }
 }
 /**
  * init dialog and show
  */
 private void showDialog() {
   progressdlg = new ProgressDialog(this);
   progressdlg.setCanceledOnTouchOutside(false);
   progressdlg.setCancelable(false);
   progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
   progressdlg.setMessage(getString(R.string.wait_moment));
   progressdlg.show();
 }
 /**
  * dismiss dialog
  */
 private void progressDismiss() {
   if (progressdlg != null) {
     progressdlg.dismiss();
   }
 }
 class MyAsyncTask extends AsyncTask<Void, Void, Void> {
   @Override
   protected Void doInBackground(Void... arg0) {
     //扫描附近WIFI信息
     result = mUtils.getScanWifiResult();
     return null;
   }
   @Override
   protected void onPostExecute(Void result) {
     super.onPostExecute(result);
     progressDismiss();
     initListViewData();
   }
 }
 private void initListViewData() {
   if (null != result && result.size() > 0) {
     wifi_lv.setAdapter(new ArrayAdapter<String>(
         getApplicationContext(), R.layout.wifi_list_item,
         R.id.ssid, result));
   } else {
     wifi_lv.setEmptyView(findViewById(R.layout.list_empty));
   }
 }
 @Override
 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
   TextView tv = (TextView) arg1.findViewById(R.id.ssid);
   if (!TextUtils.isEmpty(tv.getText().toString())) {
     Intent in = new Intent(MainActivity.this, WifiConnectActivity.class);
     in.putExtra("ssid", tv.getText().toString());
     startActivity(in);
   }
 }
}


/**
* 连接指定的WIFI
*
*/
public class WifiConnectActivity extends Activity implements OnClickListener {
 private Button connect_btn;
 private TextView wifi_ssid_tv;
 private EditText wifi_pwd_tv;
 private WifiUtils mUtils;
 // wifi之ssid
 private String ssid;
 private String pwd;
 private ProgressDialog progressdlg = null;
 @SuppressLint("HandlerLeak")
 private Handler mHandler = new Handler() {
   public void handleMessage(android.os.Message msg) {
     switch (msg.what) {
     case 0:
       showToast("WIFI连接成功");
       finish();
       break;
     case 1:
       showToast("WIFI连接失败");
       break;
     }
     progressDismiss();
   }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_connect);
   mUtils = new WifiUtils(this);
   findViews();
   setLiteners();
   initDatas();
 }
 /**
  * init dialog
  */
 private void progressDialog() {
   progressdlg = new ProgressDialog(this);
   progressdlg.setCanceledOnTouchOutside(false);
   progressdlg.setCancelable(false);
   progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
   progressdlg.setMessage(getString(R.string.wait_moment));
   progressdlg.show();
 }
 /**
  * dissmiss dialog
  */
 private void progressDismiss() {
   if (progressdlg != null) {
     progressdlg.dismiss();
   }
 }
 private void initDatas() {
   ssid = getIntent().getStringExtra("ssid");
   if (!TextUtils.isEmpty(ssid)) {
     ssid = ssid.replace("\"", "");
   }
   this.wifi_ssid_tv.setText(ssid);
 }
 private void findViews() {
   this.connect_btn = (Button) findViewById(R.id.connect_btn);
   this.wifi_ssid_tv = (TextView) findViewById(R.id.wifi_ssid_tv);
   this.wifi_pwd_tv = (EditText) findViewById(R.id.wifi_pwd_tv);
 }
 private void setLiteners() {
   connect_btn.setOnClickListener(this);
 }
 @Override
 public void onClick(View v) {
   if (v.getId() == R.id.connect_btn) {// 下一步操作
     pwd = wifi_pwd_tv.getText().toString();
     // 判断密码输入情况
     if (TextUtils.isEmpty(pwd)) {
       Toast.makeText(this, "请输入wifi密码", Toast.LENGTH_SHORT).show();
       return;
     }
     progressDialog();
     // 在子线程中处理各种业务
     dealWithConnect(ssid, pwd);
   }
 }
 private void dealWithConnect(final String ssid, final String pwd) {
   new Thread(new Runnable() {
     @Override
     public void run() {
       Looper.prepare();
       // 检验密码输入是否正确
       boolean pwdSucess = mUtils.connectWifiTest(ssid, pwd);
       try {
         Thread.sleep(4000);
       } catch (Exception e) {
         e.printStackTrace();
       }
       if (pwdSucess) {
         mHandler.sendEmptyMessage(0);
       } else {
         mHandler.sendEmptyMessage(1);
       }
     }
   }).start();
 }
 private void showToast(String str) {
   Toast.makeText(WifiConnectActivity.this, str, Toast.LENGTH_SHORT).show();
 }
}

工具类:


public class WifiUtils {
 // 上下文Context对象
 private Context mContext;
 // WifiManager对象
 private WifiManager mWifiManager;
 public WifiUtils(Context mContext) {
   this.mContext = mContext;
   mWifiManager = (WifiManager) mContext
       .getSystemService(Context.WIFI_SERVICE);
 }
 /**
  * 判断手机是否连接在Wifi上
  */
 public boolean isConnectWifi() {
   // 获取ConnectivityManager对象
   ConnectivityManager conMgr = (ConnectivityManager) mContext
       .getSystemService(Context.CONNECTIVITY_SERVICE);
   // 获取NetworkInfo对象
   NetworkInfo info = conMgr.getActiveNetworkInfo();
   // 获取连接的方式为wifi
   State wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
       .getState();
   if (info != null && info.isAvailable() && wifi == State.CONNECTED)
   {
     return true;
   } else {
     return false;
   }
 }
 /**
  * 获取当前手机所连接的wifi信息
  */
 public WifiInfo getCurrentWifiInfo() {
   return mWifiManager.getConnectionInfo();
 }
 /**
  * 添加一个网络并连接 传入参数:WIFI发生配置类WifiConfiguration
  */
 public boolean addNetwork(WifiConfiguration wcg) {
   int wcgID = mWifiManager.addNetwork(wcg);
   return mWifiManager.enableNetwork(wcgID, true);
 }
 /**
  * 搜索附近的热点信息,并返回所有热点为信息的SSID集合数据
  */
 public List<String> getScanWifiResult() {
   // 扫描的热点数据
   List<ScanResult> resultList;
   // 开始扫描热点
   mWifiManager.startScan();
   resultList = mWifiManager.getScanResults();
   ArrayList<String> ssids = new ArrayList<String>();
   if (resultList != null) {
     for (ScanResult scan : resultList) {
       ssids.add(scan.SSID);// 遍历数据,取得ssid数据集
     }
   }
   return ssids;
 }
 /**
  * 连接wifi 参数:wifi的ssid及wifi的密码
  */
 public boolean connectWifiTest(final String ssid, final String pwd) {
   boolean isSuccess = false;
   boolean flag = false;
   mWifiManager.disconnect();
   boolean addSucess = addNetwork(CreateWifiInfo(ssid, pwd, 3));
   if (addSucess) {
     while (!flag && !isSuccess) {
       try {
         Thread.sleep(10000);
       } catch (InterruptedException e1) {
         e1.printStackTrace();
       }
       String currSSID = getCurrentWifiInfo().getSSID();
       if (currSSID != null)
         currSSID = currSSID.replace("\"", "");
       int currIp = getCurrentWifiInfo().getIpAddress();
       if (currSSID != null && currSSID.equals(ssid) && currIp != 0) {
         isSuccess = true;
       } else {
         flag = true;
       }
     }
   }
   return isSuccess;
 }
 /**
  * 创建WifiConfiguration对象 分为三种情况:1没有密码;2用wep加密;3用wpa加密
  *
  * @param SSID
  * @param Password
  * @param Type
  * @return
  */
 public WifiConfiguration CreateWifiInfo(String SSID, String Password,
     int Type) {
   WifiConfiguration config = new WifiConfiguration();
   config.allowedAuthAlgorithms.clear();
   config.allowedGroupCiphers.clear();
   config.allowedKeyManagement.clear();
   config.allowedPairwiseCiphers.clear();
   config.allowedProtocols.clear();
   config.SSID = "\"" + SSID + "\"";
   WifiConfiguration tempConfig = this.IsExsits(SSID);
   if (tempConfig != null) {
     mWifiManager.removeNetwork(tempConfig.networkId);
   }
   if (Type == 1) // WIFICIPHER_NOPASS
   {
     config.wepKeys[0] = "";
     config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
     config.wepTxKeyIndex = 0;
   }
   if (Type == 2) // WIFICIPHER_WEP
   {
     config.hiddenSSID = true;
     config.wepKeys[0] = "\"" + Password + "\"";
     config.allowedAuthAlgorithms
         .set(WifiConfiguration.AuthAlgorithm.SHARED);
     config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
     config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
     config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
     config.allowedGroupCiphers
         .set(WifiConfiguration.GroupCipher.WEP104);
     config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
     config.wepTxKeyIndex = 0;
   }
   if (Type == 3) // 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;
 }
 private WifiConfiguration IsExsits(String SSID) {
   List<WifiConfiguration> existingConfigs = mWifiManager
       .getConfiguredNetworks();
   for (WifiConfiguration existingConfig : existingConfigs) {
     if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
       return existingConfig;
     }
   }
   return null;
 }
}

—–相关布局文件————–

主页面


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <Button
   android:id="@+id/search_btn"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:text="搜索附近WIFI"
   android:textSize="16sp" >
 </Button>
 <ListView
   android:id="@+id/wifi_lv"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_below="@id/search_btn"
   android:layout_marginTop="10dp"
   android:divider="#d1d1d1"
   android:dividerHeight="1px"
   android:scrollbars="none" >
 </ListView>
</RelativeLayout>

连接页面


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <TextView
   android:id="@+id/wifi_ssid"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   android:padding="10dp"
   android:text="@string/wifi_ssid"
   android:textSize="16sp" />
 <TextView
   android:id="@+id/wifi_ssid_tv"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   android:layout_toRightOf="@id/wifi_ssid"
   android:padding="10dp"
   android:textSize="16sp" />
 <TextView
   android:id="@+id/wifi_pwd"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_below="@id/wifi_ssid"
   android:layout_marginTop="15dp"
   android:padding="10dp"
   android:text="@string/wifi_pwd"
   android:textSize="16sp" />
 <EditText
   android:id="@+id/wifi_pwd_tv"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_below="@id/wifi_ssid_tv"
   android:layout_marginRight="15dp"
   android:layout_marginTop="15dp"
   android:layout_toRightOf="@id/wifi_pwd"
   android:hint="@string/input_pwd_hint"
   android:padding="10dp"
   android:textSize="16sp" />
 <Button
   android:id="@+id/connect_btn"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_margin="10dp"
   android:text="连接WIFI"
   android:textSize="16sp" >
 </Button>
</RelativeLayout>

主页面ListView的item


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:background="#FFFFFF" >
 <TextView
   android:id="@+id/ssid"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentLeft="true"
   android:layout_centerInParent="true"
   android:paddingLeft="15dp"
   android:textColor="#333333"
   android:textSize="16sp" />
</RelativeLayout>

主界面未搜索 到WIFI的展示


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#FFFFFF" >
 <TextView
   android:id="@+id/ssid"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerInParent="true"
   android:text="附近暂时没有WIFI"
   android:textColor="#333333"
   android:textSize="16sp" />
</RelativeLayout>

github上DEMO下载地址:https://github.com/ldm520/WIFI_TOOL

希望本文所述对大家Android程序设计有所帮助。

来源:http://blog.csdn.net/true100/article/details/50915993

标签:Android,wifi
0
投稿

猜你喜欢

  • 如何使用Spring工具类动态匹配url

    2021-06-16 05:09:08
  • Android使用BroadcastReceiver监听网络连接状态的改变

    2021-12-27 05:28:35
  • 详解Android中Notification通知提醒

    2023-09-10 09:57:19
  • C++类和对象之类的6个默认成员函数详解

    2022-01-05 13:50:35
  • C#根据日期计算星期几的实例代码

    2021-07-24 21:43:34
  • unity 如何获取button文本的内容

    2022-01-29 19:31:04
  • Spring 应用中集成 Apache Shiro的方法

    2023-02-18 05:44:55
  • javaweb Servlet开发总结(二)

    2023-10-31 11:51:48
  • C#实现动态创建接口并调用的实例

    2021-11-12 16:38:17
  • Android中Spinner(下拉框)控件的使用详解

    2021-08-09 01:46:28
  • 代理角色java设计模式之静态代理详细介绍

    2022-10-14 16:48:03
  • C#中Lambda表达式的用法

    2022-12-22 15:59:17
  • Spring IOC与DI核心深入理解

    2023-10-29 14:09:15
  • Hadoop1.2中配置伪分布式的实例

    2023-01-26 12:20:56
  • java利用mybatis拦截器统计sql执行时间示例

    2021-08-22 11:35:41
  • Android控件实现图片缩放功能

    2022-06-10 15:59:27
  • Android TextView显示Html类解析的网页和图片及自定义标签用法示例

    2023-06-12 04:39:41
  • springboot整合vue实现上传下载文件

    2023-11-14 07:10:37
  • Java数据结构专题解析之栈和队列的实现

    2022-11-20 01:24:21
  • Servlet3.0实现文件上传的方法

    2023-08-15 00:52:44
  • asp之家 软件编程 m.aspxhome.com