android開發-擷取wifi列表

來源:互聯網
上載者:User

標籤:sans   tom   type   作用   ons   col   find   reconnect   water   

近期博主在學frangment架構,因此想著想著就想通過listfragment完畢對wifi列表的擷取。

好!

如今就不說廢話了。

一.wifi的基礎知識

在Android的官方文檔中定義了例如以下五種狀態:

WIFI_STATE_DISABLING ?WIFI網卡正在關閉 ?0

WIFI_STATE_DISABLED ? WIFI網卡不可用 ?1
WIFI_STATE_ENABLING ? ?WIFI網卡正在開啟 ?2
WIFI_STATE_ENABLED ? ? WIFI網卡可用 ?3
WIFI_STATE_UNKNOWN ? ?WIFI網卡狀態不可知 4


而要想獲得wifi的資訊,就須要一個wifimanager對象,而

wifimanager對象須要使用Context.getSystemService(Context.WIFI_SERVICE)來擷取WifiManager對象。

在這裡我們須要知道activity這類事繼承自Context的,因此能夠MainActivity.this.getSystemService(Context.WIFI_SERVICE)來

擷取對象。假設要想得到周圍的WIFI熱點列表,能夠使用WifiManager.getScanResults()返回一個ScanResult列表

下面是從別的博主那轉載的相關wifi基本知識

(1)ScanResult

主要是通過wifi 硬體的掃描來擷取一些周邊的wifi 熱點的資訊。 在我們進行wifi 搜尋的時候,通常會搜到這些資訊,首先是存取點名字、存取點資訊的強弱、還有存取點使用的安全模式。是WPA、WPE;開啟這個類,我們能夠看到下面幾個資訊 BSSID 存取點的地址,這裡主要是指小範圍幾個無線裝置相串連所擷取的地址。比方說兩台筆記本通過無線網卡進行串連,兩方的無線網卡分配的地址。
SSID 網路的名字。當我們搜尋一個網路時,就是靠這個來區分每個不同的網路存取點。
Capabilities 網路接入的效能,這裡主要是來推斷網路的加密方式等。
Frequency 頻率,每個頻道互動的MHz 數。


Level 等級。主要來推斷網路連接的優先數。
這裡僅僅提供了一個方法。就是將獲得資訊編程字串toString()。

(2)wifiConfiguration

在我們連通一個wifi 存取點的時候。須要擷取到的一些資訊。

大家能夠跟我們有線裝置進行對照一下。
這裡的資料相對來說比較複雜一下。
六個子類
WifiConfiguration.AuthAlgorthm 用來推斷加密方法。


WifiConfiguration.GroupCipher 擷取使用GroupCipher 的方法來進行加密。
WifiConfiguration.KeyMgmt 擷取使用KeyMgmt 進行。
WifiConfiguration.PairwiseCipher 擷取使用WPA 方式的加密。
WifiConfiguration.Protocol 擷取使用哪一種協議進行加密。


wifiConfiguration.Status 擷取當前網路的狀態。
對於上述加密感興趣的朋友,能夠在網上搜尋相關的內容。


設定WifiConfiguration的屬性:
WifiConfiguration.AuthAlgorthm 設定加密方法。
可選參數:LEAP僅僅用於leap,
OPEN 被wpa/wpa2須要,
SHARED須要一個靜態wep key
WifiConfiguration.GroupCipher 使用GroupCipher 的方法來進行加密。
可選參數:CCMP,TKIP,WEP104,WEP40
WifiConfiguration.KeyMgmt 鍵管理機制(keymanagerment)。使用KeyMgmt 進行。
可選參數IEEE8021X,NONE,WPA_EAP,WPA_PSK
WifiConfiguration.PairwiseCipher 設定加密方式。
可選參數 CCMP,NONE,TKIP
WifiConfiguration.Protocol 設定一種協議進行加密。


可選參數 RSN,WPA,
wifiConfiguration.Status 設定當前網路的狀態。
可選參數CURRENT,DISABLED,ENABLED

(3)WifiInfo

在我們的wifi 已經連通了以後。能夠通過這個類獲得一些已經連通的wifi 串連的資訊擷取當前連結的資訊,
這裡資訊就比較簡單了。這裡簡介一下這裡的方法:
getBSSID() 擷取BSSID
getDetailedStateOf() 擷取client的連通性
getHiddenSSID() 獲得SSID 是否被隱藏
getIpAddress() 擷取IP 位址
getLinkSpeed() 獲得串連的速度
getMacAddress() 獲得Mac 地址
getRssi() 獲得802.11n 網路的訊號
getSSID() 獲得SSID
getSupplicanState() 返回詳細client狀態的資訊

(4)wifiManager

這個不用說,就是用來管理我們的wifi 串連。這裡已經定義好了一些類,能夠供我們使用。
這裡來說相對複雜,裡面的內容比較多,可是通過字面意思,我們還是能夠獲得非常多相關的資訊。這個類裡面預先定義了很多常量。我們能夠直接使用,不用再次建立。
這裡還是簡介一下這裡的方法:
addNetwork(WifiConfiguration config) 通過擷取到的網路的連結狀態資訊,來加入網路
calculateSignalLevel(int rssi , int numLevels) 計算訊號的等級
compareSignalLevel(int rssiA, int rssiB) 對照串連A 和串連B
createWifiLock(int lockType, String tag) 建立一個wifi 鎖,鎖定當前的wifi 串連
disableNetwork(int netId) 讓一個網路連接失效
disconnect() 中斷連線
enableNetwork(int netId, Boolean disableOthers) 串連一個串連
getConfiguredNetworks() 擷取網路連接的狀態
getConnectionInfo() 擷取當前串連的資訊
getDhcpInfo() 擷取DHCP 的資訊
getScanResulats() 擷取掃描測試的結果
getWifiState() 擷取一個wifi 存取點是否有效
isWifiEnabled() 推斷一個wifi 串連是否有效
pingSupplicant() ping 一個串連。推斷能否連通
ressociate() 即便串連沒有準備好,也要連通
reconnect() 假設串連準備好了,連通
removeNetwork() 移除某一個網路
saveConfiguration() 保留一個配置資訊
setWifiEnabled() 讓一個串連有效
startScan() 開始掃描
updateNetwork(WifiConfiguration config) 更新一個網路連接的資訊
此外wifiManaer 還提供了一個內部的子類,也就是wifiManagerLock,WifiManagerLock 的作用是這種,
在普通的狀態下,假設我們的wifi 的狀態處於閑置。那麼網路的連通,將會臨時中斷。


可是假設我們把當前的網路狀態鎖上,那麼wifi 連通將會保持在一定狀態。當然接觸鎖定之後。就會恢複常態

好了。廢話不多說了,下面我就來貼代碼圖吧。


mainfest的代碼圖

<?xml version="1.0" encoding="utf-8"?

><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.wifilisttest" android:versionCode="1" android:versionName="1.0" > <!-- 下面是使用wifi訪問網路所需的許可權 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/kkk99" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>

mainactivity

package com.example.wifilisttest;import java.util.List;import android.app.Activity;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.view.Menu;import android.view.MenuItem;import android.widget.Button;import android.widget.Toast;public class MainActivity extends FragmentActivity {private WifiManager wifiManager;    List<ScanResult> list;    String[] Flist=null;    Button but;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Fragment1 f1 = new Fragment1();          FragmentManager manager  = getSupportFragmentManager();          manager.beginTransaction().add(R.id.fragments, f1).commit();         }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}

Fragment1

package com.example.wifilisttest;import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java.util.Map;    import android.app.Activity;  import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.os.Bundle;  import android.support.v4.app.ListFragment;  import android.util.Log;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;  import android.widget.ListView;  import android.widget.SimpleAdapter;  import android.widget.TextView;  import android.widget.Toast;    /**  * @描寫敘述 在Fragment中要使用ListView。就要用ListFragment  * */  public class Fragment1 extends ListFragment   {        private String TAG = Fragment1.class.getName();      private ListView list ;      private SimpleAdapter adapter;      List<ScanResult> llll=null;    String[] Flist;private TextView Tv;private WifiManager wifiManager;    List<ScanResult> listb;/**      * @描寫敘述 在onCreateView中載入布局      * */      @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container,              Bundle savedInstanceState) {          View view = inflater.inflate(R.layout.fragment1, container,false);          list = (ListView) view.findViewById(android.R.id.list);          Tv=(TextView)view.findViewById(R.id.tv);        Tv.setText("nullTitle");                Log.i(TAG, "--------onCreateView");          return view;      }        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);                 Bundle b = savedInstanceState;          Log.i(TAG, "--------onCreate");          wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);        listb = wifiManager.getScanResults();        //數組初始化要注意        String[] listk=new String[listb.size()];        if(listb!=null){        for( int i=0;i<listb.size();i++){            ScanResult scanResult = listb.get(i);            listk[i]=scanResult.SSID;            }        }                     String[] list0=new String[listb.size()];        if(listb==null){list0[0]="NoWiFi";}        else{        list0=listk;        }        //設定Fragment1相應R.layout.listtest這個布局檔案        adapter = new SimpleAdapter(getActivity(), getData(list0), R.layout.listtest, new String[]{"title"}, new int[]{R.id.title});          setListAdapter(adapter);                }            @Override      public void onListItemClick(ListView l, View v, int position, long id) {          super.onListItemClick(l, v, position, id);          ScanResult scanResult = listb.get(position);        if(wifiManager.setWifiEnabled(true))        {         Toast.makeText(getActivity(),scanResult.SSID+position , Toast.LENGTH_LONG).show();        }        else{        Toast.makeText(getActivity(),"wifi沒開啟" , Toast.LENGTH_LONG).show();        }        System.out.println(l.getChildAt(position));          HashMap<String, Object> view= (HashMap<String, Object>) l.getItemAtPosition(position);          System.out.println(view.get("title").toString()+"+++++++++title");                                  Toast.makeText(getActivity(), TAG+l.getItemIdAtPosition(position), Toast.LENGTH_LONG).show();          System.out.println(v);                    System.out.println(position);                          }                          private List<?

extends Map<String, ?

>> getData(String[] strs) { List<Map<String ,Object>> list = new ArrayList<Map<String,Object>>(); for (int i = 0; i < strs.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("title", strs[i]); list.add(map); } return list; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.i(TAG, "--------onActivityCreated"); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.i(TAG, "----------onAttach"); } }


activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"    tools:context=".MainActivity" >    <FrameLayout         android:id="@+id/fragments"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        ></FrameLayout></LinearLayout>
fragment1.xml
<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical" >      <TextView           android:id="@+id/tv"        android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:gravity="center"                   />            <ListView           android:id="@id/android:list"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          ></ListView>    </LinearLayout> 


listtest.xml
<?xml version="1.0" encoding="utf-8"?

><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>


代碼下載

android開發-擷取wifi列表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.