android wifi操作(扫描和连接)

来源:互联网 发布:那些软件培训机构好吗 编辑:程序博客网 时间:2024/06/10 11:29

android系列wifi操作,首先应该添加如下权限:

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >    </uses-permission>
首先写一个wifisevice,操作wifi

package com.example.androidwifi;import java.io.Serializable;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.IntentService;import android.app.ProgressDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;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.os.Bundle;import android.util.Log;import android.widget.Toast;public class WifiService extends IntentService {private static final String DEBUG = "debug";private static List<ScanResult>resultList = new ArrayList<ScanResult>();private List<WifiConfiguration>wificonfigList = new ArrayList<WifiConfiguration>();private NetworkInfo mnetWorkInfo;private WifiInfo mWifiInfo;private WifiManager mwifiManager;//管理wifipublic  List<Map<String,String>>mlist = new ArrayList<Map<String,String>>();@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();//获得系统wifi服务mwifiManager = (WifiManager) getSystemService(WIFI_SERVICE);registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));}@Overrideprotected void onHandleIntent(Intent intent) {int status = intent.getExtras().getInt("status");switch (status) {case 0://open wifi && search wifiLog.d(DEBUG, "打开service wifi");if (!mwifiManager.isWifiEnabled()) {mwifiManager.setWifiEnabled(true);resultList.clear();mwifiManager.startScan();//开始搜索,当搜索到可用的wifi时,将发送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的广播while (mlist.size() == 0) {//此处休眠0.1秒是因为搜索wifi是一个耗时的操作,如果不休眠,则扫描结果可能为空try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Intent broadCastIntent = new Intent();//Bundle bundle = new Bundle();broadCastIntent.putExtra("result",(Serializable) mlist);broadCastIntent.setAction("com.androidwifi.opensuccess");sendBroadcast(broadCastIntent);}break;case 1://close wifiLog.d(DEBUG, "关闭service wifi");if (mwifiManager.isWifiEnabled()) {mwifiManager.setWifiEnabled(false);}break;case 2:int result = -1;//表示链接失败Intent resultIntent = new Intent(); resultIntent.setAction("com.androidwifi.result");String  ssid= intent.getStringExtra("ssid");String pass = intent.getStringExtra("pass");resultIntent.putExtra("ssid",ssid);int netWorkId = AddWifiConfig(resultList, ssid, pass);//添加该网络的配置if (netWorkId !=-1) {getConfigurations();boolean isConnect = ConnectWifi(netWorkId);if (isConnect) {result = 1;}}resultIntent.putExtra("result",result);sendBroadcast(resultIntent);break;default:break;}}/** * 当搜索到可用wifi时,将结果封装到mlist中 */private final BroadcastReceiver wifiReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context arg0, Intent intent) {// TODO Auto-generated method stubif (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {resultList = mwifiManager.getScanResults();sortByLevel(resultList);for (ScanResult scanResult : resultList) {Map<String,String>map = new HashMap<String, String>();map.put("wifi_name",scanResult.SSID);map.put("wifi_bssid",scanResult.BSSID);mlist.add(map);}}}};/** * 得到配置信息 */public void getConfigurations() {wificonfigList = mwifiManager.getConfiguredNetworks();}/** * 该链接是否已经配置过 * @param SSID * @return */public int isConfigured(String SSID) {for (int i = 0; i < wificonfigList.size(); i++) {if (wificonfigList.get(i).SSID.equals(SSID)) {return wificonfigList.get(i).networkId;}}return -1;}/** * 链接到制定wifi * @param wifiId * @return */public boolean ConnectWifi(int wifiId){boolean isConnect = false;int id= 0;for(int i = 0; i < wificonfigList.size(); i++){WifiConfiguration wifi = wificonfigList.get(i);id = wifi.networkId;if(id == wifiId){while(!(mwifiManager.enableNetwork(wifiId, true))){Log.i("ConnectWifi",String.valueOf(wificonfigList.get(wifiId).status));}if ( mwifiManager.enableNetwork(wifiId, true)) {isConnect = true;}}}return isConnect;}/** * 添加wifi配置 * @param wifiList * @param ssid * @param pwd * @return */public int AddWifiConfig(List<ScanResult> wifiList,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+"\"";wifiCong.hiddenSSID = false;wifiCong.status = WifiConfiguration.Status.ENABLED;wifiId = mwifiManager.addNetwork(wifiCong);if(wifiId != -1){return wifiId;}}}return wifiId;}//将搜索到的wifi根据信号强度从强到弱进行排序private void sortByLevel(List<ScanResult> resultList) {for(int i=0;i<resultList.size();i++)for(int j=1;j<resultList.size();j++){if(resultList.get(i).level<resultList.get(j).level)    //level属性即为强度{ScanResult temp = null;temp = resultList.get(i);resultList.set(i, resultList.get(j));resultList.set(j, temp);}}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubunregisterReceiver(wifiReceiver);super.onDestroy();}public WifiService() {super("");// TODO Auto-generated constructor stub}}

mainactivity.java代码如下:

package com.example.androidwifi;import java.util.List;import java.util.Map;import android.app.Activity;import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;public class MainActivity extends Activity {private Button msearchBtn;private Button mopenBtn;private Button mcloseBtn;private static  ListView msearchList;private static ProgressDialog dialog;private static LinearLayout openView;static List<Map<String,String>>mlist;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);msearchList = (ListView) findViewById(R.id.resultlist);msearchList.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {// TODO Auto-generated method stubWifiService service = new WifiService();Map<String,String>map = mlist.get(position);//得到对应的list中的mapfinal String ssid = map.get("wifi_name");//得到点击的热点的ssid,即wifi名称int wifiItemId = service.isConfigured("\""+ssid+"\"");//判断是否已经存储该热点的信息,返回bssidif (service.ConnectWifi(wifiItemId)) {view.setBackgroundResource(R.color.green);}else{//弹出对话框,输入密码View inflater = LayoutInflater.from(MainActivity.this).inflate(R.layout.ensure_conn,null);final AlertDialog alertDialog =new  AlertDialog.Builder(MainActivity.this).setTitle("请输入密码").setView(inflater).create();alertDialog.show();final EditText passEdit = (EditText) inflater.findViewById(R.id.pass);Button connBtn = (Button) inflater.findViewById(R.id.conn);connBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubString pass = passEdit.getText().toString();if (null == pass || "".equals(pass)) {Toast.makeText(MainActivity.this,"请输入密码",1000).show();return;}Intent connectIntent = new Intent(MainActivity.this,WifiService.class);Bundle bundle = new Bundle();bundle.putInt("status",2);connectIntent.putExtras(bundle);connectIntent.putExtra("ssid",ssid);connectIntent.putExtra("pass",pass);startService(connectIntent);alertDialog.dismiss();dialog =ProgressDialog.show(MainActivity.this,"","正在链接"+ssid);}});}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubgetMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {@SuppressWarnings("unused")LayoutInflater inflater = LayoutInflater.from(this);switch (item.getItemId()) {case R.id.open_wifi://open wifi && search wifiIntent openWifiIntent = new Intent(MainActivity.this,WifiService.class);Bundle openBundle = new Bundle();openBundle.putInt("status",0);openWifiIntent.putExtras(openBundle);startService(openWifiIntent);dialog = ProgressDialog.show(this,"正在打开wifi","正在搜索wifi...");break;case R.id.close_wifi://close wifiIntent closeWifiIntent = new Intent(MainActivity.this,WifiService.class);Bundle closeBundle = new Bundle();closeBundle.putInt("status",1);closeWifiIntent.putExtras(closeBundle);startService(closeWifiIntent);break;default:break;}return super.onOptionsItemSelected(item);}public static class WifiReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("com.androidwifi.opensuccess")) {@SuppressWarnings("unchecked")List<Map<String, String>>list = (List<Map<String, String>>) intent.getSerializableExtra("result");mlist = list;dialog.dismiss();//ArrayAdapter<String>adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,scanResult);SimpleAdapter adapter = new SimpleAdapter(context, mlist, R.layout.searchlist_item,new String[]{"wifi_name","wifi_bssid"},new int[]{R.id.wifi_name,R.id.wifi_bssid});msearchList.setAdapter(adapter);}}}public static class WifiResultReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (dialog.isShowing()) {dialog.dismiss();}// TODO Auto-generated method stubif (intent.getAction().equals("com.androidwifi.result")) {int result = intent.getIntExtra("result",0);String ssid = intent.getStringExtra("ssid");if (result == -1) {Toast.makeText(context,"链接"+ssid+"失败",1000).show();}if (result == 1) {Toast.makeText(context,"已链接到"+ssid,1000).show();}}}}}

源码连接http://download.csdn.net/detail/mockingbirds/8108345


1 0
原创粉丝点击