WifiManager

原创 2016年05月31日 15:23:21

WiFi模块是Android开发中也比较常用的一块,归类于网络这一大块,可能会有判断当前是WiFi状态下的网络还是数据网络。之前有遇到过一个和WiFi有关的项目,这里总结了一些知识,希望大家能了解一下:

1、操作WiFi的时候首先需要添加相应权限:

ACCESS_WIFI_STATE权限可以获取使用Wi-Fi等WLAN无线网络,加入android.permission.ACCESS_WIFI_STATE这句.
CHANGE_WIFI_STATE是改变WLAN状态的开关,如果打开或关闭Wi-Fi必需加入android.permission.CHANGE_WIFI_STATE的声明.


2、怎样获取wifi对象并进行操作

要操作WIFI设备,需要先获取Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理WIFI设备,如下是一些操作方法: 

addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。

calculateSignalLevel(int rssi , int numLevels) 计算信号的等级

compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度

createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接

disableNetwork(int netId) 让一个网络连接失效

disconnect() 断开当前的WIFI连接

enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用

getConfiguredNetworks() 获取网络连接的状态

getConnectionInfo() 获取当前连接的信息

getDhcpInfo() 获取DHCP 的信息

getScanResulats() 获取扫描测试的结果

getWifiState() 获取当前WIFI设备的状态

isWifiEnabled() 判断WIFI设备是否打开

pingSupplicant() ping操作,和PC的ping操作相同作用

ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的

reconnect() 重新连接一个未连接上的WIFI网络

removeNetwork() 移除某一个网络

saveConfiguration() 保留一个配置信息

setWifiEnabled() 让一个连接有效

startScan() 开始扫描

updateNetwork(WifiConfiguration config) 更新一个网络连接


3.常用的wifi状态

WIFI_STATE_DISABLED WIFI网卡不可用 

WIFI_STATE_DISABLING WIFI网卡正在关闭 

WIFI_STATE_ENABLED WIFI网卡可用 

WIFI_STATE_ENABLING WIFI网卡正在打开 

WIFI_STATE_UNKNOWN WIFI网卡状态不可知


4.列表查看有连接信号的wifi热点

ScanResult对象就是用来表示附近wifi热点的属性的,可以通过WifiManager.getScanResults()返回一个ScanResult列表,后面我附上查看附近wifi热点的demo,ScanResult的重要属性有一下几个:

BSSID 接入点的地址

SSID 网络的名字,唯一区别WIFI网络的名字

Capabilities 网络接入的性能

Frequency 当前WIFI设备附近热点的频率(MHz)

Level 所发现的WIFI网络信号强度


5.连接wifi热点

通过WifiManager.getConfiguredNetworks()方法会返回WifiConfiguration对象的列表,然后再调用WifiManager.enableNetwork();方法就可以连接上指定的热点。


6.查看已经连接上的wifi信息

WifiInfo是专门用来表示连接的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。

getBSSID() 获取BSSID属性

getDetailedStateOf() 获取客户端的连通性

getHiddenSSID() 获取SSID 是否被隐藏

getIpAddress() 获取IP 地址

getLinkSpeed() 获取连接的速度

getMacAddress() 获取Mac 地址

getRssi() 获取802.11n 网络的信号

getSSID() 获取SSID

getSupplicanState() 获取具体客户端状态的信息

这里有个获取WiFi热点列表显示的demo,大家可以看一下:

1.activity的布局很简单就是一个ListView,activity_wifi_list.xml内容如下: 

<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:paddingBottom="
        @dimen/activity_vertical_margin"  
    android:paddingLeft="
        @dimen/activity_horizontal_margin"  
    android:paddingRight="
        @dimen/activity_horizontal_margin"  
    android:paddingTop="
        @dimen/activity_vertical_margin"  
    tools:context=".WifiListActivity" >  
  
    <ListView  
        android:id="@+id/listView"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content" >  
    </ListView>  
  
</RelativeLayout>  
2.ListView的item布局文件item_wifi_list.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  
  
    <ImageView  
        android:id="@+id/imageView"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
        android:src="@drawable/ic_launcher" />  
  
    <TextView  
        android:id="@+id/textView"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignBottom="@+id/imageView"  
        android:layout_marginBottom="14dp"  
        android:layout_toRightOf="@+id/imageView"  
        android:text="TextView" />  
  
    <TextView  
        android:id="@+id/signal_strenth"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignBaseline="@+id/textView"  
        android:layout_alignBottom="@+id/textView"  
        android:layout_alignParentRight="true"  
        android:text="TextView" />  
  
</RelativeLayout>  
3.下面就activity的代码了,这里需要自己自定义列表。
public class WifiListActivity extends Activity {  
  
    private WifiManager wifiManager;  
    List<ScanResult> list;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_wifi_list);  
        init();  
    }  
  
    private void init() {  
        wifiManager = (WifiManager)
                 getSystemService(Context.WIFI_SERVICE);  
        openWifi();  
        list = wifiManager.getScanResults();  
        ListView listView = (ListView) 
                findViewById(R.id.listView);  
        if (list == null) {  
            Toast.makeText(this, "wifi未打开!",
                Toast.LENGTH_LONG).show();  
        }else {  
            listView.setAdapter(new MyAdapter(this,list));  
        }  
          
    }  
      
    /** 
     *  打开WIFI 
     */  
    private void openWifi() {  
       if (!wifiManager.isWifiEnabled()) {  
        wifiManager.setWifiEnabled(true);  
       }  
        
    }  
  
    public class MyAdapter extends BaseAdapter {  
  
        LayoutInflater inflater;  
        List<ScanResult> list;  
        public MyAdapter(Context context,
                 List<ScanResult> 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);  
            ScanResult scanResult = list.get(position);  
            TextView textView = (TextView) view.
                findViewById(R.id.textView);  
            textView.setText(scanResult.SSID);  
            TextView signalStrenth = (TextView) 
                view.findViewById(R.id.signal_strenth);  
            signalStrenth.setText(String
                .valueOf(Math.abs(scanResult.level)));  
            ImageView imageView = (ImageView) 
                view.findViewById(R.id.imageView);  
            //判断信号强度,显示对应的指示图标  
            if (Math.abs(scanResult.level) > 100) {  
                imageView.setImageDrawable(getResources().
                    getDrawable(R.drawable.stat_sys_wifi_signal_0));  
            } else if (Math.abs(scanResult.level) > 80) {  
                imageView.setImageDrawable(
                    getResources().getDrawable(
                    R.drawable.stat_sys_wifi_signal_1));  
            } else if (Math.abs(scanResult.level) > 70) {  
                imageView.setImageDrawable(
                    getResources().getDrawable(
                        R.drawable.stat_sys_wifi_signal_1));  
            } else if (Math.abs(scanResult.level) > 60) {  
                imageView.setImageDrawable(
                    getResources().getDrawable(
                        R.drawable.stat_sys_wifi_signal_2));  
            } else if (Math.abs(scanResult.level) > 50) {  
                imageView.setImageDrawable(
                getResources().getDrawable(
                R.drawable.stat_sys_wifi_signal_3));  
            } else {  
                imageView.setImageDrawable(
                getResources().getDrawable(
    R.drawable.stat_sys_wifi_signal_4));  
            }  
            return view;  
        }  
  
    }  
  
}  


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用WifiManager服务进行wifi相关设置实现

安卓API中提供了wifi的使用接口,在android.net.wifi包中。 既然使用了安卓系统接口,相关权限肯定少不了: 主要使用WifiManager类中提供的接口,因为Wif...
  • dreamInTheWorld
  • dreamInTheWorld
  • 2014年12月22日 17:51
  • 2340

Android WiFi 扫描和连接热点

本章主要介绍用户手动的在Settings中点击Scan和Connect按钮,输入密码后的连接过程,先看整体流程图: WiFi Scan过程分析 当用户进入Settings点击Scan后,就会调用到...
  • lilian0118
  • lilian0118
  • 2014年04月01日 11:45
  • 24825

【菜鸟学安卓】- getSystemService 总结归纳

记录下这个getSystemService 的使用感觉这个API的用处挺大,很多东西都要用到它。 对于API的查询还不是特别会用,顺便借这个机会学习一下 getSystemService是在C...
  • wduj123
  • wduj123
  • 2016年05月05日 13:33
  • 2410

wifimanager

  • 2014年12月05日 01:13
  • 346KB
  • 下载

关于wifi连接机制以及WifiManager的使用和监听wifi的方式

  • 2016年10月22日 09:39
  • 20.37MB
  • 下载

ManageEngine_WiFiManager 5.6软件

  • 2016年03月16日 16:40
  • 28.55MB
  • 下载

通过WifiManager监听Wifi信号强弱

  • 2013年11月04日 14:03
  • 1.2MB
  • 下载

ManageEngine_WiFiManager 5.6.license

  • 2016年03月16日 16:36
  • 2KB
  • 下载

android开发步步为营之48:通过WifiManager自动连上某个wifi热点

最近参加了个某个创业公司的面试,他们做了个应用,就是用户打开他们的应用就可以提供免费上网的功能,然后面试的过程中,那哥们说,你对wifi这些协议你懂吗?需要用到比较底层的东西哦,我勒个去,就这么一个上...
  • figo0423
  • figo0423
  • 2014年09月28日 20:24
  • 2191

连接到指定wifi——WIFIManager

定义工具类: public class WifiAdmin {      // 定义WifiManager对象      private WifiManager mWifiManager; ...
  • ZeoZhang
  • ZeoZhang
  • 2016年12月13日 15:34
  • 605
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WifiManager
举报原因:
原因补充:

(最多只允许输入30个字)