Android开发实践:WIFI扫描功能的封装

简介:

   网上关于Android WIFI模块开发的博文已经很多,这里我也想给出我对WIFI模块编程的一些消化结果,将Android的一些API封装类,方便在各个Android APP中复用,简化程序的开发。


   本文先给出一个扫描WIFI功能的封装成类,创建该类对象后,当你简单地调用search()函数后,后台会自动扫描当前的WIFI SSID,并以回调的形式通知你扫描结果,代码如下,需要注意的地方都用注释标注出来了。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package  com.example.testwifi;
import  java.util.ArrayList;
import  java.util.List;
import  java.util.concurrent.TimeUnit;
import  java.util.concurrent.locks.Condition;
import  java.util.concurrent.locks.Lock;
import  java.util.concurrent.locks.ReentrantLock;
import  android.content.BroadcastReceiver;
import  android.content.Context;
import  android.content.Intent;
import  android.content.IntentFilter;
import  android.net.wifi.ScanResult;
import  android.net.wifi.WifiManager;
                                   
public  class  WifiSearcher {
                                                                                                                                                                                              
     private  static  final  int  WIFI_SEARCH_TIMEOUT =  20 //扫描WIFI的超时时间
                                                                                                                                                                                              
     private  Context mContext;
     private  WifiManager mWifiManager;   
     private  WiFiScanReceiver mWifiReceiver;      
     private  Lock mLock;
     private  Condition mCondition;
     private  SearchWifiListener mSearchWifiListener;
     private  boolean  mIsWifiScanCompleted =  false ;
                                                                                                                                                                                              
     public  static  enum  ErrorType {
         SEARCH_WIFI_TIMEOUT,  //扫描WIFI超时(一直搜不到结果)
         NO_WIFI_FOUND,        //扫描WIFI结束,没有找到任何WIFI信号
     }
                                                                                                                                                                                              
     //扫描结果通过该接口返回给Caller
     public  interface  SearchWifiListener {
         public  void  onSearchWifiFailed(ErrorType errorType);
         public  void  onSearchWifiSuccess(List<String> results);
     }
                                                                                                                                                                                              
     public  WifiSearcher( Context context, SearchWifiListener listener ) {
                                                                                                                                                                                                  
         mContext = context;
         mSearchWifiListener = listener;
                                                                                                                                                                                                  
         mLock =  new  ReentrantLock();
         mCondition = mLock.newCondition();
         mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);     
                                                                                                                                                                                                  
         mWifiReceiver =  new  WiFiScanReceiver();     
     }
                                                                                                                                                                                    
     public  void  search() {
                                                                                                                                                                                                  
         new  Thread( new  Runnable() {
                                                                                                                                                                                                      
             @Override
             public  void  run() {
                 //如果WIFI没有打开,则打开WIFI
                 if ( !mWifiManager.isWifiEnabled() ) {
                     mWifiManager.setWifiEnabled( true );
                 }
                                                                                                                                                                                                                  
                 //注册接收WIFI扫描结果的监听类对象
                 mContext.registerReceiver(mWifiReceiver,  new  IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                                                                                                                                                                                                          
                 //开始扫描
                 mWifiManager.startScan();
                                                                                                                                                                                                                         
                 mLock.lock();
                                                                                                                                                                                                          
                 //阻塞等待扫描结果
                 try  {                
                     mIsWifiScanCompleted =  false ;                
                     mCondition.await(WIFI_SEARCH_TIMEOUT, TimeUnit.SECONDS);
                     if ( !mIsWifiScanCompleted ) {
                         mSearchWifiListener.onSearchWifiFailed(ErrorType.SEARCH_WIFI_TIMEOUT);
                     }
                 }
                 catch  (InterruptedException e) {
                     e.printStackTrace();
                 }
                                                                                                                                                                                                          
                 mLock.unlock();
                                                                                                                                                                                                          
                 //删除注册的监听类对象
                 mContext.unregisterReceiver(mWifiReceiver);                          
             }
         }).start();  
     }
                                                                                                                                                                                      
     //系统WIFI扫描结果消息的接收者      
     protected  class  WiFiScanReceiver  extends  BroadcastReceiver {
                                                                                                                                                                                                  
         public  void  onReceive(Context c, Intent intent) {
                                                                                                                                                                                              
             //提取扫描结果
             List<String> ssidResults =  new  ArrayList<String>();
             List<ScanResult> scanResults = mWifiManager.getScanResults();              
             for (ScanResult result : scanResults ) {
                 ssidResults.add(result.SSID);    
             }
                                                                                                                                                                                                      
             //检测扫描结果
             if ( ssidResults.isEmpty() ) {
                 mSearchWifiListener.onSearchWifiFailed(ErrorType.NO_WIFI_FOUND);
             }
             else  {
                 mSearchWifiListener.onSearchWifiSuccess(ssidResults);
             }
                                                                                                                                                                                                      
             mLock.lock();
             mIsWifiScanCompleted =  true ;
             mCondition.signalAll();  
             mLock.unlock();
         }
     }
}

   代码中用到了Lock和Condition,就是为了阻塞地等待WIFI扫描的结果,以来可以在search函数内部直接完成监听对象的registerReceiver和unregisterReceiver,防止由于某些原因忘记unregisterReceiver导致程序crash,另一方面,针对某些Android系统可能不一定能够及时收到WIFI扫描结果而设置一个超时时间,这样,不至于UI一直长时间地等待WIFI扫描结果而“假死”。


   对了,AndroidManifest.xml文件中记得添加权限支持哦:


1
2
3
< uses-permission  android:name = "android.permission.CHANGE_WIFI_STATE" ></ uses-permission >
< uses-permission  android:name = "android.permission.ACCESS_WIFI_STATE" ></ uses-permission >      
< uses-permission  android:name = "android.permission.ACCESS_NETWORK_STATE" ></ uses-permission >


本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1394948,如需转载请自行联系原作者

相关文章
|
1月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
1月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
68 4
Android开发表情emoji功能开发
|
22天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
44 3
|
8天前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
1月前
|
前端开发 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的世界里,自定义控件如同画家的画笔,能够绘制出独一无二的界面。通过掌握自定义控件的绘制技巧,开发者可以突破系统提供的界面元素限制,创造出既符合品牌形象又提供卓越用户体验的应用。本文将引导你了解自定义控件的核心概念,并通过一个简单的例子展示如何实现一个基本的自定义控件,让你的安卓应用在视觉和交互上与众不同。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
136 3
|
2月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
Java Android开发 开发者
Android 悬浮窗功能的实现
Android 悬浮窗功能的实现
1364 2
Android 悬浮窗功能的实现
|
Android开发 容器 数据格式
Android 购物车功能的实现
首先,众所周知,ListView是Android最常用的控件,可以说是最简单的控件,也可以说是最复杂的控件。 作为一个Android初级开发者,可能会简单的ListView展示图文信息。 作为一个有一定项目开发经验的Android开发者来说,可能会遇到ListView的列表项中存在各种按钮的需求。
1168 0