其他分享
首页 > 其他分享> > 项目WIFI功能总结

项目WIFI功能总结

作者:互联网

                                                               WIFI功能总结

项目 WiFi使用的功能:

1.打开wifi

2.状态监听

3.扫描wifi

4.连接wifi

5.关闭wifi

需要先配置相应的权限,如果是Android N以上级的动态申请位置权限

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

    <!-- 在android 7 以上 需要添加位置权限 -->

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

WIFI开发所关心的三个类和功能描述:

类名

功能

WifiManager

wifi统一管理类,进行各种wifi操作

WifiInfo

描述当前连接的wifi热点信息

WifiConfiguration

wifi网络配置信息

ScanResult

描述扫描出的wifi热点的信息

 

四个专业术语:

名称

功能

SSID

描述wifi热点的名称,就是大家搜索到的直接名称,如TP-LINK_88E6

BSSID

站点的 mac地址

networkID

网络号ID

RSSI

描述wifi信号强弱的值,官方叫做level

注:已经存储了wifi的信息,而这一个个wifi信息可以看作是一个以networkid为标识存储在设备上的队列

获得WifiManager的实例对象:

WifiManager mWifiManager= (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);

设置wifi开关:

boolean isOpen=mWifiManager.setWifiEnabled(true)

监听设备wifi状态的改变:

采用广播事件来进行监听状态变化,然后处理相应UI和逻辑

名称

功能

WifiManager.WIFI_STATE_CHANGED_ACTION

wifi开关变化通知

WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

wifi扫描结果通知

WifiManager.SUPPLICANT_STATE_CHANGED_ACTION

wifi连接结果通知

WifiManager.NETWORK_STATE_CHANGED_ACTION

网络状态变化通知

获取扫描wifi结果

mWifiManager.startScan();//发起扫描

List<ScanResult> Results = mWifiManager.getScanResults();//获取扫描结果(注意:第一次是null)

获取当前wifi的连接信息:

WifiInfo info = mWifiManager.getConnectionInfo();

注:如果当前没有连接wifi的话,就会返回Null,它包括了SSID、networkId、BSSID等,切记一个问题:它的SSID是带双引号的,这点和ScanResult对象不一样。

连接:

创建wifiConfigruation对象:ScanResult.capabilities

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 + "\"";      
         
      if(Type == 1) //WIFICIPHER_NOPASS   
      {           

config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);    
             }    
      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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);   
      config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);   
      config.status = WifiConfiguration.Status.ENABLED;      
      }   
       return config;    
}

添加网络并连接:

int wcgID = mWifiManager.addNetwork(config)

mWifiManager.enableNetwork(wcgID, true);

断开连接:

mWifiManager.disconnect();

总结:

1、错误:“java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.”

原因:异步线程或多处都在更新list数据,造成ListView和Adapter数据不同步。

解决方法:new 一个新的adapterList 去存源list,将adapterList 赋值给adapter数据源

if (adapterList != null) {
    adapterList.clear();
}
adapterList.addAll(list);
mListviewAdapter.addData(adapterList, mWifiAdmin);
mListviewAdapter.notifyDataSetChanged();

2、WiFi不需要在后台一直不间断循环扫描,浪费资源并容易引起错误,保持和原生WifiSettings一样,隔十秒扫一次,onPause就停止扫描。

3、初次扫描wifi 获取到的值是null,需要在初次扫描完成之后判断返回的数据长度,决定是否需要立即再扫描一次。

4、因为车机的WiFi没有删除或取消保存的操作,可能出现热点修改了密码后WiFi连不上的情况。所以修改为在WiFi连接错误的时候,重置一次密码,可避免该情况。

标签:总结,功能,wifi,WifiConfiguration,WIFI,mWifiManager,set,WifiManager,config
来源: https://blog.csdn.net/sinat_29924199/article/details/91390320