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 >
 
github上DEMO下載地址: https://github.com/ldm520/WIFI_TOOL
 
https://www.jb51.net/article/135069.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM