package com.example.wifitest;

import java.util.List;

import android.content.Context;

import android.net.wifi.ScanResult;

import android.net.wifi.WifiConfiguration;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.net.wifi.WifiManager.WifiLock;

public class WifiAdmin {

    // 定义WifiManager对象

    private WifiManager mWifiManager;

    // 定义WifiInfo对象

    private WifiInfo mWifiInfo;

    // 扫描出的网络连接列表

    private List<ScanResult> mWifiList;

    // 网络连接列表

    private List<WifiConfiguration> mWifiConfiguration;

    // 定义一个WifiLock

    WifiLock mWifiLock;

// 构造器

    public WifiAdmin(Context context) {

        // 取得WifiManager对象

        mWifiManager = (WifiManager) context

                .getSystemService(Context.WIFI_SERVICE);

        // 取得WifiInfo对象

        mWifiInfo = mWifiManager.getConnectionInfo();

    }

// 打开WIFI

    public void openWifi() {

        if (!mWifiManager.isWifiEnabled()) {

            mWifiManager.setWifiEnabled(true);

        }

    }

// 关闭WIFI

    public void closeWifi() {

        if (mWifiManager.isWifiEnabled()) {

            mWifiManager.setWifiEnabled(false);

        }

    }

// 检查当前WIFI状态

    public int checkState() {

        return mWifiManager.getWifiState();

    }

// 锁定WifiLock

    public void acquireWifiLock() {

        mWifiLock.acquire();

    }

// 解锁WifiLock

    public void releaseWifiLock() {

        // 判断时候锁定

        if (mWifiLock.isHeld()) {

            mWifiLock.acquire();

        }

    }

// 创建一个WifiLock

    public void creatWifiLock() {

        mWifiLock = mWifiManager.createWifiLock("Test");

    }

// 得到配置好的网络

    public List<WifiConfiguration> getConfiguration() {

        return mWifiConfiguration;

    }

// 指定配置好的网络进行连接

    public void connectConfiguration(int index) {

        // 索引大于配置好的网络索引返回

        if (index > mWifiConfiguration.size()) {

            return;

        }

        // 连接配置好的指定ID的网络

        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,

                true);

    }

public void startScan() {

        mWifiManager.startScan();

        // 得到扫描结果

        mWifiList = mWifiManager.getScanResults();

        // 得到配置好的网络连接

        mWifiConfiguration = mWifiManager.getConfiguredNetworks();

    }

// 得到网络列表

    public List<ScanResult> getWifiList() {

        return mWifiList;

    }

// 查看扫描结果

    public StringBuilder lookUpScan() {

        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < mWifiList.size(); i++) {

            stringBuilder

                    .append("Index_" + new Integer(i + 1).toString() + ":");

            // 将ScanResult信息转换成一个字符串包

            // 其中把包括:BSSID、SSID、capabilities、frequency、level

            stringBuilder.append((mWifiList.get(i)).toString());

            stringBuilder.append("/n");

        }

        return stringBuilder;

    }

// 得到MAC地址

    public String getMacAddress() {

        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();

    }

// 得到接入点的BSSID

    public String getBSSID() {

        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();

    }

// 得到IP地址

    public int getIPAddress() {

        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();

    }

// 得到连接的ID

    public int getNetworkId() {

        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();

    }

// 得到WifiInfo的所有信息包

    public String getWifiInfo() {

        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();

    }

// 添加一个网络并连接

    public void addNetwork(WifiConfiguration wcg) {

        int wcgID = mWifiManager.addNetwork(wcg);

        boolean b = mWifiManager.enableNetwork(wcgID, true);

        System.out.println("a--" + wcgID);

        System.out.println("b--" + b);

    }

// 断开指定ID的网络

    public void disconnectWifi(int netId) {

        mWifiManager.disableNetwork(netId);

        mWifiManager.disconnect();

    }

// 然后是一个实际应用方法,只验证过没有密码的情况:

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;

    }

}


//分为三种情况:1没有密码2用wep加密3用wpa加密

改动主要集中在CreateWifiInfo这个方法中,并且添加了一个私有方法:

(1)将与方法的第三个参数有关的变量都改成int型,或者使用原作者的枚举型(存在bug需要改正),但枚举会在后续的开发中遇到些困难;

(2)在if(type == 3)中注释掉“config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);”,并添加“

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);“这两句,否则当wifi热点需要输入密码时,无法加入网络。

(3)在代码末尾添加了方法IsExsits,原因在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始配置wifi网络之前将其移除,以避免ssid的重复:

WifiConfiguration tempConfig = this.IsExsits(SSID);

if(tempConfig != null) {

mWifiManager.removeNetwork(tempConfig.networkId);

}

以上便是wifi工具类的建立,之后就可以在其他部分实例化这个类,调用其中的方法完成加入指定ssid的wifi热点,还是先上代码吧,建立一个名为Test_wifiActivity.java的文件(同上,没有包含包声明和import语句):

[java] 
public class Test_wifiActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        WifiAdmin wifiAdmin = new WifiAdmin(this); 
        wifiAdmin.openWifi(); 
        wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo("XXX", "XXX", 3)); 
    } 
}

很简单,如果是接入wifi,大体上只涉及到openWifi(打开wifi)、CreateWifiInfo(配置wifi网络信息)和addNetwork(添加配置好的网络并连接),对CreateWifiInfo进行简单的说明:第一参数是SSID的名称;第二个参数是指定SSID网络的密码,当不需要密码是置空(”“);第三个参数是热点类型:1-无密码 / 2-WEP密码验证(未测试)/ 3-WAP或WAP2 PSK密码验证。
最后就是在Manifest中添加相应的权限了:

[java] 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>

android WIFI的一些属性的更多相关文章

  1. Android WIFI 分析(一)

    本文基于<深入理解Android WiFi NFC和GPS 卷>和 Android N 代码结合分析   WifiService 是 Frameworks中负责wifi功能的核心服务,它主 ...

  2. Android Wi-Fi基本操作

    从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序. 1.wpa_supplic ...

  3. android wifi讲解 wifi列表显示

    1.怎样获取wifi对象并进行操作 要操作WIFI设备,需要先获取Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这 ...

  4. Android Wi-Fi Display(Miracast)介绍

    地址:http://blog.csdn.net/innost/article/details/8474683 Android Wi-Fi Display(Miracast)介绍 2012年11月中旬, ...

  5. Android WiFi开发

    概述 介绍Android WiFi的扫描.连接.信息.以及WiFi热点等等的实现,并用代码实现. 详细 代码下载:http://www.demodashi.com/demo/10660.html 一. ...

  6. Android wifi管理类:WifiAdmin

    1.wifi的五种状态: WIFI_STATE_DISABLED   WIFI网卡不可用 WIFI_STATE_DISABLING WIFI网卡正在关闭 WIFI_STATE_ENABLED     ...

  7. Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...

  8. Android WiFi开发教程(二)——WiFi的搜索和连接

    在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)——WiFi热点的创建与关闭. 本章节主要继续介绍WiFi的搜索和连接. Wi ...

  9. android中xml tools属性详解

    第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...

随机推荐

  1. CMOS和TTL的區別

    TTL電路是晶體管-晶體管邏輯電路的英文縮寫(Transister-Transister-Logic ),是數字集成電路的一大門類.它采用雙極型工藝制造,具有高速度低功耗和品種多等特點. CMOS是: ...

  2. 如何通过HOOK改变windows的API函数(找到函数的相对偏移)

    我们知道,系统函数都是以DLL封装起来的,应用程序应用到系统函数时,应首先把该DLL加载到当前的进程空间中,调用的系统函数的入口地址,可以通过GetProcAddress函数进行获取.当系统函数进行调 ...

  3. 基于ffmpeg网络播放器的教程与总结

    基于ffmpeg网络播放器的教程与总结   一.         概述 为了解决在线无广告播放youku网上的视频.(youku把每个视频切换成若干个小视频). 视频资源解析可以从www.flvcd. ...

  4. 彻底解决Unknown ASTNode child: LambdaExpression 错误

    错误原因:        在于 androidStudio lint检查的时候 会把Lamda表达式 认为是错误的.解决办法:    1.打开项目中中的lint.xml改为如下格式: <?xml ...

  5. HDOJ(HDU) 1985 Conversions(汇率转换)

    Problem Description Conversion between the metric and English measurement systems is relatively simp ...

  6. tomcat thread dump 分析【转载】

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  7. hadoop 运行 datanode , mac 系统

    问题描述 今天使用 hadoop 时,发现无法通过下面命令上传文件到 hadoop 文件系统,会报错. bin/hadoop fs -put input . 运行 jps 后,输出如下: Resour ...

  8. Java WeakHashMap 源码解析

    前面把基于特定数据结构的Map介绍完了,它们分别利用了相应数据结构的特点来实现特殊的目的,像HashMap利用哈希表的快速插入.查找实现O(1)的增删改查,TreeMap则利用了红黑树来保证key的有 ...

  9. ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法

    一.上图 二.场景描写叙述 最近在做项目的时候.遇到一个怪异的需求,描写叙述例如以下: 1.ViewPager中嵌套3个View,当从View1滑动到View2时禁止ViewPager的滑动事件. 2 ...

  10. 一起来写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...