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

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android硬件相关操作与应用总结》、《Android资源操作技巧汇总》、《Android视图View技巧总结》、《Android开发入门与进阶教程》及《Android控件用法总结》

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

您可能感兴趣的文章:

  • Android获取当前已连接的wifi信号强度的方法
  • android编程实现设置、打开wifi热点共享供他人连接的方法
  • Android连接指定Wifi的方法实例代码
  • android连接wifi时获取广播地址代码
  • Android编程实现获取当前连接wifi名字的方法
  • Android 连接Wifi和创建Wifi热点的实例
  • ubuntu用wifi连接android调试程序的步骤
  • Android 判断是否连接成功了指定wifi
  • Android编程判断是否连接网络的方法【WiFi及3G判断】
  • 通过WIFI(不用数据线)连接Android手机调试
  • Android通过wifi连接手机(不需要root)
(0)

相关推荐

  • ubuntu用wifi连接android调试程序的步骤

    注:如果没有 root 权限也是可以试试,一般情况下,都需要 root 权限,才能连接成功. 1.需要确保你的开发 PC 和 Android 手机都连上了 wifi 并处于同一网段下:2.开启 usb 调试,且用 usb 将 Android 设备连接到开发 PC 上:3.进入到你的 Android SDK 的 platform-tools 目录下,执行如下命令来重启 Android 设备中的 adbd 后台程序重新侦听 TCP 的指定端口:$./adb tcpip 5555注:5555 是默认端

  • Android获取当前已连接的wifi信号强度的方法

    本文实例讲述了Android获取当前已连接的wifi信号强度的方法,是Android程序开发中非常常见的重要技巧.分享给大家供大家参考之用.具体方法如下: 1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifi_service.getConnectionInfo(); 其中wifiInfo有以下的方法: wifiinfo.ge

  • Android连接指定Wifi的方法实例代码

    本篇文章主要记录一下Android中打开Wifi.获取Wifi接入点信息及连接指接入点的方法. 自己写的demo主要用于测试接口的基本功能,因此界面及底层逻辑比较粗糙. demo的整体界面如下所示: 上图中的OPEN按键负责开启Wifi: GET按键负责获取扫描到的接入点信息. 当获取到接入点信息后,我选取了其中的名称及信号强度,以列表的形式显示在主界面下方,如下图: 当点击列表中的Item时,就会去连接对应的接入点. 自己的逻辑比较简单,测试时的代码,假定连接的是不许要密码或密码已知的接入点.

  • Android通过wifi连接手机(不需要root)

    Android通过wifi连接手机的方法,供大家参考,具体内容如下 1.首先电脑,手机连接同一个网络 2.在Android studio中Terminal中输入adb devices 3.输入:adb tcpip 5555 4.打开手机,在设置->WLAN->连得wif点击->里查看ip 5.输入:adb connect 192.168.1.108:5555 6.输入:adb devices 在查看下: 完成 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • android连接wifi时获取广播地址代码

    复制代码 代码如下: private InetAddress getBroadcastAddress() throws IOException { WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); DhcpInfo myDhcpInfo = myWifiManager.getDhcpInfo(); if (myDhcpInfo == null) { System.out.println("Could

  • Android 判断是否连接成功了指定wifi

    最近在做wifi的相关的东西,打印WifiInfo的时候 无意间发现一个参数,改参数可以查看是否连接成功了指定wifi,但是这是隐藏的,遂将其反射之.代码如下: //通过反射的方式去判断wifi是否已经连接上,并且可以开始传输数据 private boolean checkWiFiConnectSuccess() { Class classType = WifiInfo.class; try { Object invo = classType.newInstance(); Object resu

  • 通过WIFI(不用数据线)连接Android手机调试

    Android开发中少不了真机调试,总用数据线插插拔拔的还是不方便也不稳定,其实可以实现WIFI的方式连接android手机. 1. 当然首先要打开WIFI,手机要和电脑在同一局域网内. 2. 在手机上安装AdbWireless(Google Play上需搜一下就有),注意手机是需要root过的. 3. 安装完毕后在手机上启动AdbWireless,按屏幕中央的大按钮激活无线连接: 如何通过WIFI连接(不用数据线)Android手机调试 4. 按照屏幕提示,在电脑上从Android SDK\p

  • Android 连接Wifi和创建Wifi热点的实例

    本文实例讲述了连接Wifi和创建Wifi热点的方法.分享给大家供大家参考,具体如下: android的热点功能不可见,用了反射的技术搞定之外. Eclipse设置语言为utf-8才能查看中文注释 上代码: MainActivity.java package com.widget.hotspot; import android.os.Bundle; import android.app.Activity; import android.content.BroadcastReceiver; impo

  • Android编程判断是否连接网络的方法【WiFi及3G判断】

    本文实例讲述了Android编程判断是否连接网络的方法.分享给大家供大家参考,具体如下: 判断wifi网络是否链接: public static boolean isWiFiActive(Context inContext) { WifiManager mWifiManager = (WifiManager) inContext .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = mWifiManager.getConnect

  • android编程实现设置、打开wifi热点共享供他人连接的方法

    本文实例讲述了android编程实现设置.打开wifi热点共享供他人连接的方法.分享给大家供大家参考,具体如下: 用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可以通过热点的名字来进行判断吧.下面我们就来探讨一下如何自动创建一个wifi热点吧 创建wifi热点首先需要手机支持,建议开发的哥们整个好点的手机,我们公司那些个山寨设备,几近有一半是不支持热

  • Android编程实现获取当前连接wifi名字的方法

    本文实例讲述了Android编程实现获取当前连接wifi名字的方法.分享给大家供大家参考,具体如下: WifiManager wifiMgr = (WifiManager) mActivity.getSystemService(Context.WIFI_SERVICE); int wifiState = wifiMgr.getWifiState(); WifiInfo info = wifiMgr.getConnectionInfo(); String wifiId = info != null

随机推荐