1. 程式人生 > >android開發-獲取wifi列表

android開發-獲取wifi列表

inline fim date conn port ats htm 有效 width

近期博主在學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;
	@Override
	protected 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(); 
        
	}

	@Override
	public 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;
	}

	@Override
	public 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列表