在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。简单介绍一下:

大致可以分为四个主要的类ScanResult,wifiConfiguration,WifiInfo,WifiManager

(1)ScanResult,主要是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。

(2)wifiConfiguration 在我们连通一个wifi 接入点的时候,需要获取到的一些信息。大家可以跟我们有线的设备进行对比一下。

(3)WifiInfo 在我们的wifi 已经连通了以后,可以通过这个类获得一些已经连通的wifi 连接的信息获取当前链接的信息,这里信息就比较简单了,这里简单介绍一下这里的方法:

getBSSID() 获取BSSID

getDetailedStateOf() 获取客户端的连通性

getHiddenSSID() 获得SSID 是否被隐藏

getIpAddress() 获取IP 地址

getLinkSpeed() 获得连接的速度

getMacAddress() 获得Mac 地址

getRssi() 获得802.11n 网络的信号

getSSID() 获得SSID

getSupplicanState() 返回具体客户端状态的信息

(4)wifiManager 这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。这里来说相对复杂,里面的内容比较多,但是通过字面意思,我们还是可以获得很多相关的信息。这个类里面预先定义了许多常量,我们可以直接使用,不用再次创建。

介绍完了,开始写一个Demo吧。程序已启动效果图如下:

Android之Wifi学习1_第1张图片

看代码,其中有注释,我就不多说了。

布局文件代码:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/mScrollView"android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"android:scrollbars="vertical">
  5. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  6. android:orientation="vertical"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. >
  10. <TextView
  11. android:id="@+id/allNetWork"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. android:text="当前没有扫描到Wifi网络"
  15. />
  16. <Button
  17. android:id="@+id/scan"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="扫描网络"
  21. />
  22. <Button
  23. android:id="@+id/start"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="打开Wifi"
  27. />
  28. <Button
  29. android:id="@+id/stop"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:text="关闭Wifi"
  33. />
  34. <Button
  35. android:id="@+id/check"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:text="Wifi状态"
  39. />
  40. </LinearLayout>
  41. </ScrollView>

上面布局文件中的ScrollView用来在Activity中显示右侧滚动条,如果数据多的话,则可以往下滑动继续显示未显示完的数据。

主页面代码:

[java] view plain copy
  1. packageorg.sunchao;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.net.wifi.ScanResult;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.ScrollView;
  10. importandroid.widget.TextView;
  11. importandroid.widget.Toast;
  12. publicclassMainextendsActivityimplementsOnClickListener{
  13. //右侧滚动条按钮
  14. privateScrollViewsView;
  15. privateTextViewallNetWork;
  16. privateButtonscan;
  17. privateButtonstart;
  18. privateButtonstop;
  19. privateButtoncheck;
  20. privateWifiAdminmWifiAdmin;
  21. //扫描结果列表
  22. privateList<ScanResult>list;
  23. privateScanResultmScanResult;
  24. privateStringBuffermStringBuffer=newStringBuffer();
  25. /**Calledwhentheactivityisfirstcreated.*/
  26. @Override
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. mWifiAdmin=newWifiAdmin(Main.this);
  31. init();
  32. }
  33. //按钮的初始化
  34. publicvoidinit(){
  35. sView=(ScrollView)findViewById(R.id.mScrollView);
  36. allNetWork=(TextView)findViewById(R.id.allNetWork);
  37. scan=(Button)findViewById(R.id.scan);
  38. start=(Button)findViewById(R.id.start);
  39. stop=(Button)findViewById(R.id.stop);
  40. check=(Button)findViewById(R.id.check);
  41. scan.setOnClickListener(Main.this);
  42. start.setOnClickListener(Main.this);
  43. stop.setOnClickListener(Main.this);
  44. check.setOnClickListener(Main.this);
  45. }
  46. //WIFI_STATE_DISABLING0
  47. //WIFI_STATE_DISABLED1
  48. //WIFI_STATE_ENABLING2
  49. //WIFI_STATE_ENABLED3
  50. publicvoidstart(){
  51. mWifiAdmin.openWifi();
  52. Toast.makeText(Main.this,"当前Wifi网卡状态为"+mWifiAdmin.checkState(),
  53. Toast.LENGTH_SHORT).show();
  54. }
  55. publicvoidstop(){
  56. mWifiAdmin.closeWifi();
  57. Toast.makeText(Main.this,"当前Wifi网卡状态为"+mWifiAdmin.checkState(),
  58. Toast.LENGTH_SHORT).show();
  59. }
  60. publicvoidcheck(){
  61. Toast.makeText(Main.this,"当前Wifi网卡状态为"+mWifiAdmin.checkState(),
  62. Toast.LENGTH_SHORT).show();
  63. }
  64. publicvoidgetAllNetWorkList(){
  65. //每次点击扫描之前清空上一次的扫描结果
  66. if(mStringBuffer!=null){
  67. mStringBuffer=newStringBuffer();
  68. }
  69. //开始扫描网络
  70. mWifiAdmin.startScan();
  71. list=mWifiAdmin.getWifiList();
  72. if(list!=null){
  73. for(inti=0;i<list.size();i++){
  74. mScanResult=list.get(i);
  75. //得到网络的SSID:thenetworkname
  76. mStringBuffer=mStringBuffer
  77. .append(mScanResult.SSID).append("")
  78. .append(mScanResult.BSSID).append("")
  79. .append(mScanResult.capabilities).append("")
  80. .append(mScanResult.frequency).append("")
  81. .append(mScanResult.level).append("")
  82. .append("\n\n");
  83. }
  84. allNetWork.setText("扫描到的所有Wifi网络:\n"+mStringBuffer.toString());
  85. }
  86. }
  87. @Override
  88. publicvoidonClick(Viewv){
  89. switch(v.getId()){
  90. caseR.id.scan:
  91. getAllNetWorkList();
  92. break;
  93. caseR.id.start:
  94. start();
  95. break;
  96. caseR.id.stop:
  97. stop();
  98. break;
  99. caseR.id.check:
  100. check();
  101. break;
  102. default:
  103. break;
  104. }
  105. }
  106. }

上面用到了一个WifiAdmin类,这是我自己写的一个类,用于对Wifi的操作进行一次封装,里面的方法很多,我们本次Demo只用到了其中几种,但我还是先全部放上去吧,以后会用到的。

WifiAdmin工具类代码:

[java] view plain copy
  1. packageorg.sunchao;
  2. importjava.util.List;
  3. importandroid.content.Context;
  4. importandroid.net.wifi.ScanResult;
  5. importandroid.net.wifi.WifiConfiguration;
  6. importandroid.net.wifi.WifiInfo;
  7. importandroid.net.wifi.WifiManager;
  8. importandroid.net.wifi.WifiManager.WifiLock;
  9. publicclassWifiAdmin{
  10. //定义WifiManager对象
  11. privateWifiManagermWifiManager;
  12. //定义WifiInfo对象
  13. privateWifiInfomWifiInfo;
  14. //扫描出的网络连接列表
  15. privateList<ScanResult>mWifiList;
  16. //网络连接列表
  17. privateList<WifiConfiguration>mWifiConfiguration;
  18. //定义一个WifiLock
  19. WifiLockmWifiLock;
  20. //构造器
  21. publicWifiAdmin(Contextcontext){
  22. //取得WifiManager对象
  23. mWifiManager=(WifiManager)context
  24. .getSystemService(Context.WIFI_SERVICE);
  25. //取得WifiInfo对象
  26. mWifiInfo=mWifiManager.getConnectionInfo();
  27. }
  28. //打开WIFI
  29. publicvoidopenWifi(){
  30. if(!mWifiManager.isWifiEnabled()){
  31. mWifiManager.setWifiEnabled(true);
  32. }
  33. }
  34. //关闭WIFI
  35. publicvoidcloseWifi(){
  36. if(mWifiManager.isWifiEnabled()){
  37. mWifiManager.setWifiEnabled(false);
  38. }
  39. }
  40. //检查当前WIFI状态
  41. publicintcheckState(){
  42. returnmWifiManager.getWifiState();
  43. }
  44. //锁定WifiLock
  45. publicvoidacquireWifiLock(){
  46. mWifiLock.acquire();
  47. }
  48. //解锁WifiLock
  49. publicvoidreleaseWifiLock(){
  50. //判断时候锁定
  51. if(mWifiLock.isHeld()){
  52. mWifiLock.acquire();
  53. }
  54. }
  55. //创建一个WifiLock
  56. publicvoidcreatWifiLock(){
  57. mWifiLock=mWifiManager.createWifiLock("Test");
  58. }
  59. //得到配置好的网络
  60. publicList<WifiConfiguration>getConfiguration(){
  61. returnmWifiConfiguration;
  62. }
  63. //指定配置好的网络进行连接
  64. publicvoidconnectConfiguration(intindex){
  65. //索引大于配置好的网络索引返回
  66. if(index>mWifiConfiguration.size()){
  67. return;
  68. }
  69. //连接配置好的指定ID的网络
  70. mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
  71. true);
  72. }
  73. publicvoidstartScan(){
  74. mWifiManager.startScan();
  75. //得到扫描结果
  76. mWifiList=mWifiManager.getScanResults();
  77. //得到配置好的网络连接
  78. mWifiConfiguration=mWifiManager.getConfiguredNetworks();
  79. }
  80. //得到网络列表
  81. publicList<ScanResult>getWifiList(){
  82. returnmWifiList;
  83. }
  84. //查看扫描结果
  85. publicStringBuilderlookUpScan(){
  86. StringBuilderstringBuilder=newStringBuilder();
  87. for(inti=0;i<mWifiList.size();i++){
  88. stringBuilder
  89. .append("Index_"+newInteger(i+1).toString()+":");
  90. //将ScanResult信息转换成一个字符串包
  91. //其中把包括:BSSID、SSID、capabilities、frequency、level
  92. stringBuilder.append((mWifiList.get(i)).toString());
  93. stringBuilder.append("/n");
  94. }
  95. returnstringBuilder;
  96. }
  97. //得到MAC地址
  98. publicStringgetMacAddress(){
  99. return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
  100. }
  101. //得到接入点的BSSID
  102. publicStringgetBSSID(){
  103. return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
  104. }
  105. //得到IP地址
  106. publicintgetIPAddress(){
  107. return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();
  108. }
  109. //得到连接的ID
  110. publicintgetNetworkId(){
  111. return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();
  112. }
  113. //得到WifiInfo的所有信息包
  114. publicStringgetWifiInfo(){
  115. return(mWifiInfo==null)?"NULL":mWifiInfo.toString();
  116. }
  117. //添加一个网络并连接
  118. publicvoidaddNetwork(WifiConfigurationwcg){
  119. intwcgID=mWifiManager.addNetwork(wcg);
  120. mWifiManager.enableNetwork(wcgID,true);
  121. }
  122. //断开指定ID的网络
  123. publicvoiddisconnectWifi(intnetId){
  124. mWifiManager.disableNetwork(netId);
  125. mWifiManager.disconnect();
  126. }
  127. }

最后,我们看一下AndroidManifest.xml配置文件的代码,里面有需要用到的权限。这个比较重要,我刚开始就是忘记添加这些权限,程序一启动就挂。后来看LogCat才知道少了这些权限的。
AndroidManifest.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="org.sunchao"android:versionCode="1"android:versionName="1.0">
  4. <uses-sdkandroid:minSdkVersion="8"/>
  5. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  6. <activityandroid:name=".Main"android:label="@string/app_name">
  7. <intent-filter>
  8. <actionandroid:name="android.intent.action.MAIN"/>
  9. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  10. </intent-filter>
  11. </activity>
  12. </application>
  13. <!--以下是使用wifi访问网络所需的权限-->
  14. <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
  15. <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  16. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  17. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  18. </manifest>

至此这个Demo就完成了,看效果图。

Android之Wifi学习1_第2张图片

Android之Wifi学习1_第3张图片

Android之Wifi学习1_第4张图片


更多相关文章

  1. Android状态机StateMachine使用举例及源码解析
  2. 【Android初学者】超简单的注册页面,填写完整信息实现 跳转 和 传
  3. Android AdbCommandRejectedException和cannot bind to套接字地
  4. Android 新建xml文档用来保存配置信息
  5. 使用Content Provider得到联系人信息
  6. python获取android设备的GPS信息脚本分享
  7. Android 网络编程之---HttpClient 与 HttpURLConnection 共用coo
  8. android缓存框架ASimpleCache的使用 (网络请求数据并缓存)
  9. 【Android】沉浸式状态栏完美解决方案

随机推荐

  1. const用法是什么?
  2. C语言中输出字符串用什么符号
  3. c语言输入五个数如何求平均值?
  4. c语言根号函数是什么
  5. c语言大于等于怎么打?
  6. c程序中宏展开是在什么时候进行的?
  7. 用C语言指针如何求最大值最小值
  8. c++定义数组的方法
  9. c语言中%是什么意思
  10. C语言程序的模块化通过什么实现