安卓如何连wifi
安卓如何連wifi
安卓系統設置之Wifi連接?在網上查了很多資料,但是有的是無法連接免費的wifi,有的是無法使用,后來找到一個好用的wifi連接,但是忘了是哪篇 - -
直接上代碼了
1.MainActivity
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.TextView;import com.futurus.hud.setting.R; import com.futurus.hud.setting.adapter.WifiAdapter; import com.futurus.hud.setting.base.BaseActivity;import java.util.List;public class WifiActivity extends BaseActivity {private static final String TAG = "WifiActivity";private Button mBtnWifiToggle;private WifiManager mWifiManager;private ListView mLvWifiList;private WifiAdapter mAdapter;private TextView mTxtSearch;private WifiConfiguration config;private static final int WIFICIPHER_NOPASS = 1;private static final int WIFICIPHER_WEP = 2;private static final int WIFICIPHER_WPA = 3;private TextView text_state;//沒10s 刷新Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {while (!thread.isInterrupted()) {Thread.sleep(10000);search();}} catch (Exception e) {Log.e(TAG, "run: " + e.toString());}}});@Overridepublic int getLayout() {return R.layout.activity_wifi;}@Overridepublic void initView() {mWifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);mBtnWifiToggle = (Button) findViewById(R.id.wifi_toggle);mLvWifiList = (ListView) findViewById(R.id.wifi_lv);mTxtSearch = (TextView) findViewById(R.id.wifi_search);text_state = (TextView) findViewById(R.id.text_state);initBroadcastReceiver();thread.start();mAdapter = new WifiAdapter(this, R.layout.item_wifi2);mLvWifiList.setAdapter(mAdapter);mLvWifiList.setSelector(R.drawable.selector_setting_list_item);}@Overridepublic void initData() {mLvWifiList.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewparent, View view, int position, long id) {mWifiManager.disconnect();final ScanResult scanResult = (ScanResult) mAdapter.getItem(position);String capabilities = scanResult.capabilities;int type = WIFICIPHER_WPA;if (!TextUtils.isEmpty(capabilities)) {if (capabilities.contains("WPA") || capabilities.contains("wpa")) {type = WIFICIPHER_WPA;} else if (capabilities.contains("WEP") || capabilities.contains("wep")) {type = WIFICIPHER_WEP;} else {type = WIFICIPHER_NOPASS;}}config = isExsits(scanResult.SSID);if (config == null) {if (type != WIFICIPHER_NOPASS) {//需要密碼final int finalType = type;Intent intent = new Intent(WifiActivity.this, InputPwActivity.class);intent.putExtra("item", scanResult.SSID);intent.putExtra("type", finalType);startActivityForResult(intent, 0);} else {config = createWifiInfo(scanResult.SSID, "", type);connect(config);}} else {connect(config);}}});}@Overrideprotected void onResume() {checkWifiState();super.onResume();}private void connect(WifiConfiguration config) {text_state.setText("連接中...");int wcgID = mWifiManager.addNetwork(config);mWifiManager.enableNetwork(wcgID, true);}private void initBroadcastReceiver() {IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(receiver, intentFilter);}//點擊事件public void wifiToggle(View view) {if (wifiIsOpen()) {mBtnWifiToggle.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0, R.drawable.close, 0);mWifiManager.setWifiEnabled(false);mBtnWifiToggle.setClickable(false);} else if (!wifiIsOpen()) {mBtnWifiToggle.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0, R.drawable.open, 0);mWifiManager.setWifiEnabled(true);mBtnWifiToggle.setClickable(false);}checkWifiState();search();}//檢查狀態public void checkWifiState() {Log.e(TAG, "checkWifiState: " + wifiIsOpen());if (wifiIsOpen()) {mBtnWifiToggle.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0, R.drawable.open, 0);if (mAdapter.getCount() != 0) {mLvWifiList.setVisibility(View.VISIBLE);mTxtSearch.setVisibility(View.GONE);} else {mLvWifiList.setVisibility(View.GONE);mTxtSearch.setVisibility(View.VISIBLE);}mBtnWifiToggle.setText("開");text_state.setVisibility(View.VISIBLE);} else if (!wifiIsOpen()) {mBtnWifiToggle.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0, R.drawable.close, 0);mLvWifiList.setVisibility(View.GONE);mTxtSearch.setVisibility(View.GONE);mBtnWifiToggle.setText("關");text_state.setVisibility(View.GONE);}mBtnWifiToggle.setClickable(true);}public boolean wifiIsOpen() {return mWifiManager.isWifiEnabled();}/** * 搜索wifi熱點 */private void search() {checkWifiState();mWifiManager.startScan();}private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {Log.w("BBB", "SCAN_RESULTS_AVAILABLE_ACTION");// wifi已成功掃描到可用wifi。ListscanResults = mWifiManager.getScanResults(); mAdapter.clear(); mAdapter.addAll(scanResults); } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { Log.w("BBB", "WifiManager.WIFI_STATE_CHANGED_ACTION"); int wifiState = intent.getIntExtra( WifiManager.EXTRA_WIFI_STATE, 0); switch (wifiState) { case WifiManager.WIFI_STATE_ENABLED: //獲取到wifi開啟的廣播時,開始掃描 mWifiManager.startScan(); break; case WifiManager.WIFI_STATE_DISABLED: //wifi關閉發出的廣播 break; } } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { Log.w("BBB", "WifiManager.NETWORK_STATE_CHANGED_ACTION"); NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) { text_state.setText("連接已斷開"); text_state.setTextColor(Color.WHITE); } else if (info.getState().equals(NetworkInfo.State.CONNECTED)) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final WifiInfo wifiInfo = wifiManager.getConnectionInfo(); text_state.setText("已連接到網絡:" + wifiInfo.getSSID()); text_state.setTextColor(getResources().getColor(R.color.textColor)); } else { NetworkInfo.DetailedState state = info.getDetailedState(); text_state.setTextColor(getResources().getColor(R.color.textColor)); if (state == state.CONNECTING) { text_state.setText("連接中..."); } else if (state == state.AUTHENTICATING) { text_state.setText("正在驗證身份信息..."); } else if (state == state.OBTAINING_IPADDR) { text_state.setText("正在獲取IP地址..."); } else if (state == state.FAILED) { text_state.setText("連接失敗"); } } } checkWifiState(); } }; /** * 判斷當前wifi是否有保存 * * @param SSID * @return */ private WifiConfiguration isExsits(String SSID) { ListexistingConfigs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return existingConfig; } } return null; } public WifiConfiguration createWifiInfo(String SSID, String password, int type) { Log.w("AAA", "SSID = " + SSID + "password " + password + "type =" + 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 == WIFICIPHER_NOPASS) { config.wepKeys[0] = "\"" + "\""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } else if (type == WIFICIPHER_WEP) { config.preSharedKey = "\"" + password + "\""; config.hiddenSSID = true; 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; } else if (type == 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; } else { return null; } return config; } @Override protected void onDestroy() { unregisterReceiver(receiver); super.onDestroy(); } //獲取輸入的密碼 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 0 && resultCode == 1) { String password = data.getStringExtra("password"); String ssid = data.getStringExtra("ssid"); int type = data.getIntExtra("type", -1); config = createWifiInfo(ssid, password, type); connect(config); } } }2 . 網上都有類似的Utils類 - - wifiUtils
public class WifiUtils {//定義幾種加密方式,一種是WEP,一種是WPA,還有沒有密碼的情況public enum WifiCipherType{WIFICIPHER_WEP,WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID}private static final String TAG = "WifiUtils";private WifiManager localWifiManager;//提供Wifi管理的各種主要API,主要包含wifi的掃描、建立連接、配置信息等//private ListwifiScanList;//ScanResult用來描述已經檢測出的接入點,包括接入的地址、名稱、身份認證、頻率、信號強度等private ListwifiConfigList;//WIFIConfiguration描述WIFI的鏈接信息,包括SSID、SSID隱藏、password等的設置 private WifiInfo wifiConnectedInfo;//已經建立好網絡鏈接的信息 private WifiManager.WifiLock wifiLock;//阻止WIFI也進入睡眠狀態及WIFI的關閉 public WifiUtils( Context context){ localWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); } //檢查WIFI狀態 public int WifiCheckState(){ return localWifiManager.getWifiState(); } //開啟WIFI public void WifiOpen(){ if(!localWifiManager.isWifiEnabled()){ localWifiManager.setWifiEnabled(true); } } //關閉WIFI public void WifiClose(){ if(!localWifiManager.isWifiEnabled()){ localWifiManager.setWifiEnabled(false); } } //掃描wifi public void WifiStartScan(){ localWifiManager.startScan(); } //得到Scan結果 public ListgetScanResults(){ return localWifiManager.getScanResults();//得到掃描結果 } //Scan結果轉為Sting public ListscanResultToString(Listlist){ ListstrReturnList = new ArrayList(); for(int i = 0; i < list.size(); i++){ ScanResult strScan = list.get(i); String str = strScan.toString(); boolean bool = strReturnList.add(str); if(!bool){ Log.i("scanResultToSting","Addfail"); } } return strReturnList; } //得到Wifi配置好的信息 public void getConfiguration(){ wifiConfigList = localWifiManager.getConfiguredNetworks();//得到配置好的網絡信息 for(int i =0;i"getConfiguration",wifiConfigList.get(i).SSID); Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId)); } } //判定指定WIFI是否已經配置好,依據WIFI的地址BSSID,返回NetId public int IsConfiguration(String SSID){ // Log.i("IsConfiguration",String.valueOf(wifiConfigList.size())); for(int i = 0; i < wifiConfigList.size(); i++){ Log.i(wifiConfigList.get(i).SSID,String.valueOf( wifiConfigList.get(i).networkId)); if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同 return wifiConfigList.get(i).networkId; } } return -1; } public WifiConfiguration IsExsits(String SSID) { ListexistingConfigs = localWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\""+SSID+"\"")) { return existingConfig; } } return null; } //添加指定WIFI的配置信息,原列表不存在此SSID public int AddWifiConfig(ListwifiList,String ssid,String pwd){ int wifiId = -1; for(int i = 0;i < wifiList.size(); i++){ ScanResult wifi = wifiList.get(i); if(wifi.SSID.equals(ssid)){ Log.i("AddWifiConfig","equals"); WifiConfiguration wifiCong = new WifiConfiguration(); wifiCong.SSID = "\""+wifi.SSID+"\"";//\"轉義字符,代表" wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密碼 wifiCong.hiddenSSID = false; wifiCong.status = WifiConfiguration.Status.ENABLED; wifiId = localWifiManager.addNetwork(wifiCong);//將配置好的特定WIFI密碼信息添加,添加完成后默認是不激活狀態,成功返回ID,否則為-1 if(wifiId != -1){ return wifiId; } } } return wifiId; } //連接指定Id的WIFI public boolean ConnectWifi(int wifiId){ for(int i = 0; i < wifiConfigList.size(); i++){ WifiConfiguration wifi = wifiConfigList.get(i); if(wifi.networkId == wifiId){ while(!(localWifiManager.enableNetwork(wifiId, true))){//激活該Id,建立連接 Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(wifiId).status));//status:0--已經連接,1--不可連接,2--可以連接 } return true; } } return false; } //創建一個WIFILock public void createWifiLock(String lockName){ wifiLock = localWifiManager.createWifiLock(lockName); } //鎖定wifilock public void acquireWifiLock(){ wifiLock.acquire(); } //解鎖WIFI public void releaseWifiLock(){ if(wifiLock.isHeld()){//判定是否鎖定 wifiLock.release(); } } //得到建立連接的信息 public void getConnectedInfo(){ wifiConnectedInfo = localWifiManager.getConnectionInfo(); } //得到連接的MAC地址 public String getConnectedMacAddr(){ return (wifiConnectedInfo == null)? "NULL":wifiConnectedInfo.getMacAddress(); } //得到連接的名稱SSID public String getConnectedSSID(){ return (wifiConnectedInfo == null)? "NULL":wifiConnectedInfo.getSSID(); } //得到連接的IP地址 public int getConnectedIPAddr(){ return (wifiConnectedInfo == null)? 0:wifiConnectedInfo.getIpAddress(); } //得到連接的ID public int getConnectedID(){ return (wifiConnectedInfo == null)? 0:wifiConnectedInfo.getNetworkId(); } public WifiConfiguration CreateWifiInfo(String SSID, String Password, WifiCipherType 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 == WifiCipherType.WIFICIPHER_NOPASS) { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if(Type == WifiCipherType.WIFICIPHER_WEP) { config.preSharedKey = "\""+Password+"\""; config.hiddenSSID = true; 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 == WifiCipherType.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.status = WifiConfiguration.Status.ENABLED; } else { return null; } return config; } }3 .可以實時跟新狀態的adapter (我的baseadapter無法更新了….)
public class WifiAdapter extends ArrayAdapter<ScanResult> {private final LayoutInflater mInflater;private int mResource;public static final String WIFI_AUTH_OPEN = "";public static final String WIFI_AUTH_ROAM = "[ESS]";public WifiAdapter(Context context, int resource) {super(context, resource);mInflater = LayoutInflater.from(context);mResource = resource;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(mResource, parent, false);}TextView name = (TextView) convertView.findViewById(R.id.item_wifi_name);ImageView signl = (ImageView) convertView.findViewById(R.id.item_wifi_signal);ScanResult scanResult = getItem(position);name.setText(scanResult.SSID);String capabilities = scanResult.capabilities;int level = scanResult.level;level = WifiManager.calculateSignalLevel(level, 100);if (capabilities != null&& (capabilities.equals(WIFI_AUTH_OPEN) || capabilities.equals(WIFI_AUTH_ROAM))) {if (level >= 0 && level <= 25) {signl.setImageResource(R.drawable.icon_wifi_signal_1);} else if (level > 25 && level <= 50) {signl.setImageResource(R.drawable.icon_wifi_signal_2);} else if (level > 50 && level <= 75) {signl.setImageResource(R.drawable.icon_wifi_signal_3);} else if (level > 75 && level <= 100) {signl.setImageResource(R.drawable.icon_wifi_signal_4);}} else {if (level >= 0 && level <= 25) {signl.setImageResource(R.drawable.icon_wifi_lock_signal_1);} else if (level > 25 && level <= 50) {signl.setImageResource(R.drawable.icon_wifi_lock_signal_2);} else if (level > 50 && level <= 75) {signl.setImageResource(R.drawable.icon_wifi_lock_signal_3);} else if (level > 75 && level <= 100) {signl.setImageResource(R.drawable.icon_wifi_lock_signal_4);}}return convertView;} }4 . 輸入密碼的界面
public class InputPwActivity extends BaseActivity implements View.OnClickListener {private Button mBtnReady;private Button mBtnCancel;private EditText mEditTextPw;private CheckBox mCheckPw;private String ssid;private int type;Runnable run2 = new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}View rootview = InputPwActivity.this.getWindow().getDecorView();View aaa = rootview.findFocus();Log.i("tag", aaa.toString());}}};private CheckBox mCheck;@Overridepublic int getLayout() {return R.layout.activity_input_pw;}@Overridepublic void initView() {Intent intent = getIntent();ssid = intent.getStringExtra("item");type = intent.getIntExtra("type", -1);mBtnReady = (Button) findViewById(R.id.btn_ready);mBtnCancel = (Button) findViewById(R.id.btn_cancel);mEditTextPw = (EditText) findViewById(R.id.wifi_password); // new Thread(run2).start();mCheckPw = (CheckBox) findViewById(R.id.wifi_check);mBtnReady.setOnClickListener(this);mBtnCancel.setOnClickListener(this);mEditTextPw.setOnClickListener(this);}@Overridepublic void initData() {if (mCheckPw.isChecked()) {mEditTextPw.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);} else {mEditTextPw.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_ready:if(!TextUtils.isEmpty(mEditTextPw.getText())){String trim = mEditTextPw.getText().toString().trim();Intent intent = new Intent();intent.putExtra("password", trim);intent.putExtra("ssid", ssid);intent.putExtra("type", type);setResult(1, intent);}finish();break;case R.id.btn_cancel:finish();break;case R.id.wifi_password:InputMethodManager imm = (InputMethodManager)InputPwActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);break;case R.id.wifi_check:if(mCheckPw.isChecked()){mCheckPw.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);} else {mCheckPw.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);}break;}}}總結
- 上一篇: f1c200s核心板_F1C200s N
- 下一篇: 2010年6月16日最新NOD32激活码