1. 程式人生 > >Android wifi掃描及連線

Android wifi掃描及連線

主介面,搜尋附近WIFI資訊

/**
 * Search WIFI and show in ListView
 * 
 */
public class MainActivity extends Activity implements OnClickListener,
        OnItemClickListener {
    private Button search_btn;
    private ListView wifi_lv;
    private WifiUtils mUtils;
    private List<String> result;
    private
ProgressDialog progressdlg = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUtils = new WifiUtils(this); findViews(); setLiteners(); } private
void findViews() { this.search_btn = (Button) findViewById(R.id.search_btn); this.wifi_lv = (ListView) findViewById(R.id.wifi_lv); } private void setLiteners() { search_btn.setOnClickListener(this); wifi_lv.setOnItemClickListener(this); } @Override public
void onClick(View v) { if (v.getId() == R.id.search_btn) { showDialog(); new MyAsyncTask().execute(); } } /** * init dialog and show */ private void showDialog() { progressdlg = new ProgressDialog(this); progressdlg.setCanceledOnTouchOutside(false); progressdlg.setCancelable(false); progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressdlg.setMessage(getString(R.string.wait_moment)); progressdlg.show(); } /** * dismiss dialog */ private void progressDismiss() { if (progressdlg != null) { progressdlg.dismiss(); } } class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... arg0) { //掃描附近WIFI資訊 result = mUtils.getScanWifiResult(); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); progressDismiss(); initListViewData(); } } private void initListViewData() { if (null != result && result.size() > 0) { wifi_lv.setAdapter(new ArrayAdapter<String>( getApplicationContext(), R.layout.wifi_list_item, R.id.ssid, result)); } else { wifi_lv.setEmptyView(findViewById(R.layout.list_empty)); } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tv = (TextView) arg1.findViewById(R.id.ssid); if (!TextUtils.isEmpty(tv.getText().toString())) { Intent in = new Intent(MainActivity.this, WifiConnectActivity.class); in.putExtra("ssid", tv.getText().toString()); startActivity(in); } } }
/**
 * 連線指定的WIFI
 *
 */
public class WifiConnectActivity extends Activity implements OnClickListener {
    private Button connect_btn;
    private TextView wifi_ssid_tv;
    private EditText wifi_pwd_tv;
    private WifiUtils mUtils;
    // wifi之ssid
    private String ssid;
    private String pwd;
    private ProgressDialog progressdlg = null;
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0:
                showToast("WIFI連線成功");
                finish();
                break;
            case 1:
                showToast("WIFI連線失敗");
                break;

            }
            progressDismiss();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_connect);
        mUtils = new WifiUtils(this);
        findViews();
        setLiteners();
        initDatas();
    }

    /**
     * init dialog
     */
    private void progressDialog() {
        progressdlg = new ProgressDialog(this);
        progressdlg.setCanceledOnTouchOutside(false);
        progressdlg.setCancelable(false);
        progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressdlg.setMessage(getString(R.string.wait_moment));
        progressdlg.show();
    }

    /**
     * dissmiss dialog
     */
    private void progressDismiss() {
        if (progressdlg != null) {
            progressdlg.dismiss();
        }
    }

    private void initDatas() {
        ssid = getIntent().getStringExtra("ssid");
        if (!TextUtils.isEmpty(ssid)) {
            ssid = ssid.replace("\"", "");
        }
        this.wifi_ssid_tv.setText(ssid);
    }

    private void findViews() {
        this.connect_btn = (Button) findViewById(R.id.connect_btn);
        this.wifi_ssid_tv = (TextView) findViewById(R.id.wifi_ssid_tv);
        this.wifi_pwd_tv = (EditText) findViewById(R.id.wifi_pwd_tv);
    }

    private void setLiteners() {
        connect_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.connect_btn) {// 下一步操作
            pwd = wifi_pwd_tv.getText().toString();
            // 判斷密碼輸入情況
            if (TextUtils.isEmpty(pwd)) {
                Toast.makeText(this, "請輸入wifi密碼", Toast.LENGTH_SHORT).show();
                return;
            }
            progressDialog();
            // 在子執行緒中處理各種業務
            dealWithConnect(ssid, pwd);
        }
    }

    private void dealWithConnect(final String ssid, final String pwd) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                // 檢驗密碼輸入是否正確
                boolean pwdSucess = mUtils.connectWifiTest(ssid, pwd);
                try {
                    Thread.sleep(4000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (pwdSucess) {
                    mHandler.sendEmptyMessage(0);
                } else {
                    mHandler.sendEmptyMessage(1);
                }
            }
        }).start();
    }

    private void showToast(String str) {
        Toast.makeText(WifiConnectActivity.this, str, Toast.LENGTH_SHORT).show();
    }
}

工具類:

public class WifiUtils {
    // 上下文Context物件
    private Context mContext;
    // WifiManager物件
    private WifiManager mWifiManager;

    public WifiUtils(Context mContext) {
        this.mContext = mContext;
        mWifiManager = (WifiManager) mContext
                .getSystemService(Context.WIFI_SERVICE);
    }

    /**
     * 判斷手機是否連線在Wifi上
     */
    public boolean isConnectWifi() {
        // 獲取ConnectivityManager物件
        ConnectivityManager conMgr = (ConnectivityManager) mContext
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        // 獲取NetworkInfo物件
        NetworkInfo info = conMgr.getActiveNetworkInfo();
        // 獲取連線的方式為wifi
        State wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                .getState();

        if (info != null && info.isAvailable() && wifi == State.CONNECTED)

        {
            return true;
        } else {
            return false;
        }

    }

    /**
     * 獲取當前手機所連線的wifi資訊
     */
    public WifiInfo getCurrentWifiInfo() {
        return mWifiManager.getConnectionInfo();
    }

    /**
     * 新增一個網路並連線 傳入引數:WIFI發生配置類WifiConfiguration
     */
    public boolean addNetwork(WifiConfiguration wcg) {
        int wcgID = mWifiManager.addNetwork(wcg);
        return mWifiManager.enableNetwork(wcgID, true);
    }

    /**
     * 搜尋附近的熱點資訊,並返回所有熱點為資訊的SSID集合資料
     */
    public List<String> getScanWifiResult() {
        // 掃描的熱點資料
        List<ScanResult> resultList;
        // 開始掃描熱點
        mWifiManager.startScan();
        resultList = mWifiManager.getScanResults();
        ArrayList<String> ssids = new ArrayList<String>();
        if (resultList != null) {
            for (ScanResult scan : resultList) {
                ssids.add(scan.SSID);// 遍歷資料,取得ssid資料集
            }
        }
        return ssids;
    }

    /**
     * 連線wifi 引數:wifi的ssid及wifi的密碼
     */
    public boolean connectWifiTest(final String ssid, final String pwd) {
        boolean isSuccess = false;
        boolean flag = false;
        mWifiManager.disconnect();
        boolean addSucess = addNetwork(CreateWifiInfo(ssid, pwd, 3));
        if (addSucess) {
            while (!flag && !isSuccess) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                String currSSID = getCurrentWifiInfo().getSSID();
                if (currSSID != null)
                    currSSID = currSSID.replace("\"", "");
                int currIp = getCurrentWifiInfo().getIpAddress();
                if (currSSID != null && currSSID.equals(ssid) && currIp != 0) {
                    isSuccess = true;
                } else {
                    flag = true;
                }
            }
        }
        return isSuccess;

    }

    /**
     * 建立WifiConfiguration物件 分為三種情況:1沒有密碼;2用wep加密;3用wpa加密
     * 
     * @param SSID
     * @param Password
     * @param Type
     * @return
     */
    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;
    }

}

—–相關佈局檔案————–
主頁面

<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" >

    <Button
        android:id="@+id/search_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="搜尋附近WIFI"
        android:textSize="16sp" >
    </Button>

    <ListView
        android:id="@+id/wifi_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/search_btn"
        android:layout_marginTop="10dp"
        android:divider="#d1d1d1"
        android:dividerHeight="1px"
        android:scrollbars="none" >
    </ListView>

</RelativeLayout>

連線頁面

<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" >

    <TextView
        android:id="@+id/wifi_ssid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:padding="10dp"
        android:text="@string/wifi_ssid"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/wifi_ssid_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/wifi_ssid"
        android:padding="10dp"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/wifi_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/wifi_ssid"
        android:layout_marginTop="15dp"
        android:padding="10dp"
        android:text="@string/wifi_pwd"
        android:textSize="16sp" />

    <EditText
        android:id="@+id/wifi_pwd_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/wifi_ssid_tv"
        android:layout_marginRight="15dp"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/wifi_pwd"
        android:hint="@string/input_pwd_hint"
        android:padding="10dp"
        android:textSize="16sp" />

    <Button
        android:id="@+id/connect_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_margin="10dp"
        android:text="連線WIFI"
        android:textSize="16sp" >
    </Button>

</RelativeLayout>

主頁面ListView的item

<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="40dp"
    android:background="#FFFFFF" >

    <TextView
        android:id="@+id/ssid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:paddingLeft="15dp"
        android:textColor="#333333"
        android:textSize="16sp" />

</RelativeLayout>

主介面未搜尋 到WIFI的展示

<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:background="#FFFFFF" >

    <TextView
        android:id="@+id/ssid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="附近暫時沒有WIFI"
        android:textColor="#333333"
        android:textSize="16sp" />

</RelativeLayout>