android wifi操作(扫描和连接)
jopen
9年前
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;//管理wifi public List<Map<String,String>>mlist = new ArrayList<Map<String,String>>(); @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //获得系统wifi服务 mwifiManager = (WifiManager) getSystemService(WIFI_SERVICE); registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); } @Override protected void onHandleIntent(Intent intent) { int status = intent.getExtras().getInt("status"); switch (status) { case 0://open wifi && search wifi Log.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 block e.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 wifi Log.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() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub if (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); } } } @Override public void onDestroy() { // TODO Auto-generated method stub unregisterReceiver(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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); msearchList = (ListView) findViewById(R.id.resultlist); msearchList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) { // TODO Auto-generated method stub WifiService service = new WifiService(); Map<String,String>map = mlist.get(position);//得到对应的list中的map final String ssid = map.get("wifi_name");//得到点击的热点的ssid,即wifi名称 int wifiItemId = service.isConfigured("\""+ssid+"\"");//判断是否已经存储该热点的信息,返回bssid if (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() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String 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); } }); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { @SuppressWarnings("unused") LayoutInflater inflater = LayoutInflater.from(this); switch (item.getItemId()) { case R.id.open_wifi://open wifi && search wifi Intent 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 wifi Intent 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 { @Override public 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 { @Override public void onReceive(Context context, Intent intent) { if (dialog.isShowing()) { dialog.dismiss(); } // TODO Auto-generated method stub if (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
来自: http://blog.csdn.net//mockingbirds/article/details/40680389