android wifi开发
2017-10-26 18:55
489 查看
这个小项目实现了,WiFi的开关、获取WiFi扫描列表、获取保存的WiFi列表、连接WiFi、获取WiFi连接的各种状态。利用接口回调实现活动与广播的通信。下面是一张效果图。
使用WiFi需要这么几个权限。
简单说一下几个比较容易出问题的地方,WiFi扫描获取WiFi列表的时候,一定要注册了一个监听扫描完成的广播,虽然不监听广播也能获取的列表,但是你不知道它什么时候扫描完的,而且WiFi是会自己不断的扫描的,监听广播也就可以像手机WiFi那样自动的刷新列表了。连接WiFi的时候要根据WiFi锁的类型来连接(一般是psk),代码中有给出。WiFimanager有多个广播,通过监听广播得到很多信息代码中没有给出全部,可以参考文档:http://www.android-doc.com/reference/android/net/wifi/WifiManager.html 然后关于连接状态,代码中给了几个常见的身份验证、获取ID、连接失败什么的。这些状态都在networkinfo中,如需要获取其他信息查看这个类的DetailedState:http://www.android-doc.com/reference/android/net/NetworkInfo.html。关于活动去广播通信,最常用的是接口回调(我这里用的就是接口回调),当然还有其他的方式,如静态变量(需要主活动开个线程一直去读这个变量),广播接收器里面再发送一个简单的广播给活动(毕竟广播经常用来通信)。
给个项目的下载地址:http://download.csdn.net/download/lhp15575865420/10040883
使用WiFi需要这么几个权限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
简单说一下几个比较容易出问题的地方,WiFi扫描获取WiFi列表的时候,一定要注册了一个监听扫描完成的广播,虽然不监听广播也能获取的列表,但是你不知道它什么时候扫描完的,而且WiFi是会自己不断的扫描的,监听广播也就可以像手机WiFi那样自动的刷新列表了。连接WiFi的时候要根据WiFi锁的类型来连接(一般是psk),代码中有给出。WiFimanager有多个广播,通过监听广播得到很多信息代码中没有给出全部,可以参考文档:http://www.android-doc.com/reference/android/net/wifi/WifiManager.html 然后关于连接状态,代码中给了几个常见的身份验证、获取ID、连接失败什么的。这些状态都在networkinfo中,如需要获取其他信息查看这个类的DetailedState:http://www.android-doc.com/reference/android/net/NetworkInfo.html。关于活动去广播通信,最常用的是接口回调(我这里用的就是接口回调),当然还有其他的方式,如静态变量(需要主活动开个线程一直去读这个变量),广播接收器里面再发送一个简单的广播给活动(毕竟广播经常用来通信)。
给个项目的下载地址:http://download.csdn.net/download/lhp15575865420/10040883
public class MainActivity extends AppCompatActivity { private Button button1; private Button button2; private Button button3; private MyAdapter myAdapter; private LinkedList<Data> datas; private RecyclerView recycle; private WifiManager wifiManager; private WifiInfo wifiInfo; private Mywifi mywifi; private List<ScanResult> results; private List<WifiConfiguration> configurations; private WifiReceiver wifiReceiver; private final int SCANRE=1;//搜索到WiFi列表标志 private final int CONFIG=2;//连接过WiFi列表标志 private static int change=1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1= (Button) findViewById(R.id.button1); button2= (Button) findViewById(R.id.button2); button3= (Button) findViewById(R.id.button3); initRecyclerView(); mywifi=new Mywifi(MainActivity.this); initReceiver(); somelisten(); } public void initRecyclerView(){ recycle= (RecyclerView) findViewById(R.id.recycle); datas=new LinkedList<Data>(); datas.add(new Data("WiFI名字","物理地址")); myAdapter=new MyAdapter(datas,MainActivity.this); //设置布局为线性布局,默认竖直 recycle.setLayoutManager(new LinearLayoutManager(this)); recycle.setAdapter(myAdapter); //设置添加和删除的动画效果 recycle.setItemAnimator(new DefaultItemAnimator()); //设置横向分割线 recycle.addItemDecoration(new DividerItemDecoration(MainActivity.this, LinearLayoutManager.VERTICAL)); } public void somelisten(){ button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (mywifi.checkwifistate()){ case 0: Toast.makeText(MainActivity.this,"WiFi正在关闭",Toast.LENGTH_SHORT).show(); break; case 1: mywifi.openwifi(); break; case 2: Toast.makeText(MainActivity.this,"WiFi正在打开",Toast.LENGTH_SHORT).show(); break; case 3: mywifi.closewifi(); break; } } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(change==SCANRE){ myAdapter.removeAll(); configurations=mywifi.getConfigurations(); if(configurations!=null) for(int i=0;i<configurations.size();i++){ myAdapter.add(new Data(configurations.get(i).SSID, "物理地址不确定")); } change=CONFIG; }else{ myAdapter.removeAll(); results=mywifi.getWifilist(); for(int i=0;i<results.size();i++){ myAdapter.add(new Data(results.get(i).SSID, results.get(i).BSSID)); } change=SCANRE; } } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mywifi.closeconnect(); } }); myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int postion) { if(results==null) return; if(change==CONFIG){ Toast.makeText(MainActivity.this,"只能连接搜索到的WiFi",Toast.LENGTH_SHORT).show(); return; } Toast.makeText(MainActivity.this,results.get(postion).toString(),Toast.LENGTH_SHORT).show(); mywifi.wificonnect(results.get(postion),"12345678");//假设密码是12345678 } @Override public void onItemLongClick(View view, int postion) { } }); } public void initReceiver(){ wifiReceiver=new WifiReceiver(); IntentFilter intentFilter=new IntentFilter(); intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); registerReceiver(wifiReceiver,intentFilter); //回调接口监听 wifiReceiver.setMsglistener(new WifiReceiver.Msg() { @Override public void getmsg(String msg) { if(msg.equals("ok")){ myAdapter.removeAll(); results=mywifi.getWifilist(); Log.e("扫描结果", String.valueOf(results.size())); for(int i=0;i<results.size();i++){ myAdapter.add(new Data( results.get(i).SSID, results.get(i).BSSID)); } } } }); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(wifiReceiver); } }
public class Mywifi { private WifiManager wifiManager;//WiFi管理器 privat 4000 e WifiInfo wifiInfo; private List<ScanResult> wifilist;//扫描到的WiFi列表 private List<WifiConfiguration> configurations;//配置好(连接过)的WiFi列表 //锁屏后,其他程序没有用到WiFi,过一会WiFi会自动关闭,加WiFi后则不会 private WifiManager.WifiLock lock;//wifi锁。 public Mywifi(Context context) { wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); lock=wifiManager.createWifiLock(2,"mylock"); /*locktype 1:会自动连接一个记住的接入点。没有连接到记住的接入点的时候,自动扫描, 2:只扫描,在这种模式下,程序必须显示地请求扫描 3:以最好的性能执行1 */ } //打开WiFi,锁定WiFi,扫描WiFi public void openwifi(){ if(!wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(true); Log.e("Wifi","打开WiFi"); lock.acquire(); } scan(); } //扫描WiFi public void scan(){wifiManager.startScan();} //关闭WiFi public void closewifi(){ if(wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(false); } } //检查WiFi状态 public int checkwifistate(){ //0:wifi正在关闭。1:WiFi已经关闭。2:WiFi正在开启。3:WiFi已经开启 return wifiManager.getWifiState(); } //获取搜索到的WiFi列表 public List<ScanResult> getWifilist(){ wifilist=wifiManager.getScanResults(); return wifilist; } //获取连接过的WiFi列表 public List<WifiConfiguration> getConfigurations(){ configurations=wifiManager.getConfiguredNetworks(); return configurations; } //连接指定WiFi public void wificonnect(ScanResult scan,String password){ WifiConfiguration config=new WifiConfiguration(); //对config初始化,将他的各个参数清空 config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID=scan.SSID;//通过ssid来标识一个WiFi Log.e("WiFi连接",scan.SSID); //判断锁的类型。通过scanresult的结果是否含有某些值来确定 //根据锁的类型来设置某些参数 if(scan.capabilities.contains("WEP")){ Log.e("WiFi连接","wep加密"); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); // config.allowedAuthAlgorithms.set(WifiConfiguration.GroupCipher.WEP40); // config.allowedAuthAlgorithms.set(WifiConfiguration.GroupCipher.CCMP); // config.allowedAuthAlgorithms.set(WifiConfiguration.GroupCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); config.wepTxKeyIndex=0; config.wepKeys[0]=password; }else if(scan.capabilities.contains("PSK")){ Log.e("WiFi连接","psk加密"); config.preSharedKey="\""+password+"\""; }else if(scan.capabilities.contains("EAP")){ Log.e("WiFi连接","eap加密"); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedAuthAlgorithms.set(WifiConfiguration.GroupCipher.TKIP); config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.preSharedKey="\""+password+"\""; }else {//没有加密 Log.e("WiFi连接","没有加密"); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); //config.wepTxKeyIndex=0; //config.wepKeys[0]=""; } int i=wifiManager.addNetwork(config);//连接到WiFi。 Log.e("连接结果", String.valueOf(i)); } //断开连接 public void closeconnect(){ //wifiManager.disconnect(); wifiInfo=wifiManager.getConnectionInfo();//获取当前连接 int netid=wifiInfo.getNetworkId(); wifiManager.disableNetwork(netid); } }
public class WifiReceiver extends BroadcastReceiver{ private Msg msg;//与activity通信 @Override public void onReceive(Context context, Intent intent) { String action=intent.getAction(); Log.e("action",action); if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){ int wifistate=intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_DISABLED); if(wifistate==WifiManager.WIFI_STATE_ENABLED) { Log.e("广播wifistate", "wifi打开"); } if(wifistate==WifiManager.WIFI_STATE_DISABLED) Log.e("广播wifistate","wifi关闭"); } else if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)){ Log.e("广播sacn","wifi扫描完成"); msg.getmsg("ok"); } else if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)){ NetworkInfo info=intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if(info.getState().equals(NetworkInfo.State.DISCONNECTED)) Log.e("广播Network","WiFi网络连接断开"); if(info.getState().equals(NetworkInfo.State.CONNECTED)) Log.e("广播Network","连接到WiFi网络"); if(info.getDetailedState().equals(NetworkInfo.DetailedState.OBTAINING_IPADDR)) Log.e("广播Network","获取IP地址中"); if(info.getDetailedState().equals(NetworkInfo.DetailedState.DISCONNECTED)) Log.e("广播Network","ip不可用"); if(info.getDetailedState().equals(NetworkInfo.DetailedState.SCANNING)) Log.e("广播Network","正在扫描"); if(info.getDetailedState().equals(NetworkInfo.DetailedState.AUTHENTICATING)) Log.e("广播Network","身份验证中"); if(info.getDetailedState().equals(NetworkInfo.DetailedState.FAILED)) Log.e("广播Network","连接失败"); //http://www.android-doc.com/reference/android/net/NetworkInfo.html } //http://www.android-doc.com/reference/android/net/wifi/WifiManager.html } //通过接口实现与activity之间的通信 public interface Msg{ public void getmsg(String msg); } public void setMsglistener(Msg msg){ this.msg=msg; } }
相关文章推荐
- 【移动开发】Android中WIFI开发总结(一)
- Android/安卓开发之WIFI通讯(上)--搜索区域网内所有设备
- android WIFI开发
- Android WiFi开发中遇到的问题
- android之wifi开发(一)
- Android中WIFI开发总结
- Android平台开发-WIFI 驱动移植 -- 详细
- android wifi连接开发
- android开发中Wifi功能总结
- android开发工具类之获得WIFI IP地址或者手机网络IP
- android开发之系统服务(检测网络是否通畅与开关WiFi)
- android wifi开发介绍
- 【Android开发】wifi开关与wifi连接(密码连接)
- Android开发--WIFI实现
- Android开发周围wifi热点和属性的获取
- android wifi组播发送开发日常问题汇总
- android 开发通过 wifi 无线调试(不用root)
- Android wifi开发
- android wifi驱动开发日记(一)
- Android开发之WIFI网络操作