Android WiFi开发 (二)分享Wifi热点

 

Android WiFi开发 (二)Wifi热点

标签: wi-fiandroid热点安全
  11415人阅读  评论(29)  收藏  举报
  分类:

目录(?)[+]

接着上一篇wifi的扫描连接等,这一篇主要说一下手机开启Wifi热点。

demo的下载地址会在最下面贴出来。

图片:

       

1 创建WIFI热点

经测试开启wifi热点(无秘密,wpa安全类型,wpa2安全类型)都可以正常开启并使用。

需要注意的是wifi和wifi热点不能同时打开,也就是连接wifi的时候,开启热点需要先将wifi关闭才可以。

用到的主要代码:

[java]  view plain  copy
 print ?
  1. package com.vn.wifitest.utils;  
  2.   
  3.   
  4. import java.lang.reflect.InvocationTargetException;  
  5. import java.lang.reflect.Method;  
  6. import android.content.BroadcastReceiver;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.content.IntentFilter;  
  10. import android.net.wifi.WifiConfiguration;  
  11. import android.net.wifi.WifiConfiguration.KeyMgmt;  
  12. import android.net.wifi.WifiManager;  
  13. import android.os.Handler;  
  14. import android.util.Log;  
  15.   
  16. public class WifiAPUtil {  
  17.     private static final String TAG = "WifiAPUtil";  
  18.     public final static boolean DEBUG = true;  
  19.   
  20.     public static final int MESSAGE_AP_STATE_ENABLED = 1;  
  21.     public static final int MESSAGE_AP_STATE_FAILED = 2;  
  22.     //默认wifi秘密  
  23.     private static final String DEFAULT_AP_PASSWORD = "12345678";     
  24.     private static WifiAPUtil sInstance;  
  25.     private static Handler mHandler;  
  26.     private static Context mContext;  
  27.     private WifiManager mWifiManager;  
  28.     //监听wifi热点的状态变化  
  29.     public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";  
  30.     public static final String EXTRA_WIFI_AP_STATE = "wifi_state";  
  31.     public static int WIFI_AP_STATE_DISABLING = 10;  
  32.     public static int WIFI_AP_STATE_DISABLED = 11;  
  33.     public static int WIFI_AP_STATE_ENABLING = 12;  
  34.     public static int WIFI_AP_STATE_ENABLED = 13;  
  35.     public static int WIFI_AP_STATE_FAILED = 14;  
  36.     public enum WifiSecurityType {  
  37.         WIFICIPHER_NOPASS, WIFICIPHER_WPA, WIFICIPHER_WEP, WIFICIPHER_INVALID, WIFICIPHER_WPA2  
  38.     }  
  39.     private WifiAPUtil(Context context) {  
  40.         if(DEBUG) Log.d(TAG,"WifiAPUtils construct");   
  41.         mContext = context;  
  42.         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
  43.         IntentFilter filter = new IntentFilter();  
  44.         filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);  
  45.         context.registerReceiver(mWifiStateBroadcastReceiver, filter);  
  46.     }  
  47.     protected void finalize() {  
  48.         if(DEBUG) Log.d(TAG,"finalize");  
  49.         mContext.unregisterReceiver(mWifiStateBroadcastReceiver);  
  50.   
  51. }  
  52.     public static WifiAPUtil getInstance(Context c) {  
  53.         if (null == sInstance)  
  54.             sInstance = new WifiAPUtil(c);  
  55.         return sInstance;  
  56.     }  
  57.   
  58.     public boolean turnOnWifiAp(String str, String password,WifiSecurityType Type) {  
  59.         String ssid = str;  
  60.         //配置热点信息。  
  61.         WifiConfiguration wcfg = new WifiConfiguration();  
  62.         wcfg.SSID = new String(ssid);  
  63.         wcfg.networkId = 1;  
  64.         wcfg.allowedAuthAlgorithms.clear();  
  65.         wcfg.allowedGroupCiphers.clear();  
  66.         wcfg.allowedKeyManagement.clear();  
  67.         wcfg.allowedPairwiseCiphers.clear();  
  68.         wcfg.allowedProtocols.clear();  
  69.           
  70.         if(Type == WifiSecurityType.WIFICIPHER_NOPASS) {  
  71.             if(DEBUG)Log.d(TAG, "wifi ap----no password");  
  72.             wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN, true);  
  73.             wcfg.wepKeys[0] = "";      
  74.             wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);      
  75.             wcfg.wepTxKeyIndex = 0;  
  76.         } else if(Type == WifiSecurityType.WIFICIPHER_WPA) {  
  77.             if(DEBUG)Log.d(TAG, "wifi ap----wpa");  
  78.             //密码至少8位,否则使用默认密码  
  79.             if(null != password && password.length() >= 8){  
  80.                 wcfg.preSharedKey = password;  
  81.             } else {  
  82.                 wcfg.preSharedKey = DEFAULT_AP_PASSWORD;  
  83.             }  
  84.             wcfg.hiddenSSID = false;         
  85.             wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);         
  86.             wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                               
  87.             wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);       
  88.             //wcfg.allowedKeyManagement.set(4);  
  89.             wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                          
  90.             wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);        
  91.             wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);      
  92.             wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);      
  93.         } else if(Type == WifiSecurityType.WIFICIPHER_WPA2) {  
  94.             if(DEBUG)Log.d(TAG, "wifi ap---- wpa2");  
  95.             //密码至少8位,否则使用默认密码  
  96.             if(null != password && password.length() >= 8){  
  97.                 wcfg.preSharedKey = password;  
  98.             } else {  
  99.                 wcfg.preSharedKey = DEFAULT_AP_PASSWORD;  
  100.             }       
  101.             wcfg.hiddenSSID = true;         
  102.             wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);         
  103.             wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                               
  104.             wcfg.allowedKeyManagement.set(4);       
  105.             //wcfg.allowedKeyManagement.set(4);  
  106.             wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                          
  107.             wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);        
  108.             wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);      
  109.             wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);      
  110.         }         
  111.         try {  
  112.             Method method = mWifiManager.getClass().getMethod("setWifiApConfiguration",   
  113.                                       wcfg.getClass());  
  114.             Boolean rt = (Boolean)method.invoke(mWifiManager, wcfg);  
  115.             if(DEBUG) Log.d(TAG, " rt = " + rt);  
  116.         } catch (NoSuchMethodException e) {  
  117.             Log.e(TAG, e.getMessage());  
  118.         } catch (IllegalArgumentException e) {  
  119.             Log.e(TAG, e.getMessage());  
  120.         } catch (IllegalAccessException e) {  
  121.             Log.e(TAG, e.getMessage());  
  122.         } catch (InvocationTargetException e) {  
  123.             Log.e(TAG, e.getMessage());  
  124.         }  
  125.         return setWifiApEnabled();  
  126.     }  
  127.     //获取热点状态      
  128.     public int getWifiAPState() {  
  129.         int state = -1;  
  130.         try {  
  131.             Method method2 = mWifiManager.getClass().getMethod("getWifiApState");  
  132.             state = (Integer) method2.invoke(mWifiManager);  
  133.         } catch (Exception e) {  
  134.             Log.e(TAG, e.getMessage());  
  135.         }  
  136.         if(DEBUG)Log.i("WifiAP""getWifiAPState.state " + state);  
  137.         return state;  
  138.     }  
  139.       
  140.     private boolean setWifiApEnabled() {          
  141.         //开启wifi热点需要关闭wifi  
  142.         while(mWifiManager.getWifiState() != WifiManager.WIFI_STATE_DISABLED){  
  143.             mWifiManager.setWifiEnabled(false);  
  144.             try {  
  145.                 Thread.sleep(200);  
  146.             } catch (Exception e) {  
  147.                 Log.e(TAG, e.getMessage());  
  148.                 return false;  
  149.             }  
  150.         }  
  151.         // 确保wifi 热点关闭。  
  152.         while(getWifiAPState() != WIFI_AP_STATE_DISABLED){  
  153.             try {  
  154.             Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",  
  155.                        WifiConfiguration.classboolean.class);  
  156.             method1.invoke(mWifiManager, nullfalse);  
  157.           
  158.                 Thread.sleep(200);  
  159.             } catch (Exception e) {  
  160.                 Log.e(TAG, e.getMessage());  
  161.                     return false;  
  162.             }  
  163.         }  
  164.           
  165.         //开启wifi热点  
  166.         try {  
  167.         Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",  
  168.                        WifiConfiguration.classboolean.class);  
  169.         method1.invoke(mWifiManager, nulltrue);         
  170.                 Thread.sleep(200);  
  171.             } catch (Exception e) {  
  172.                 Log.e(TAG, e.getMessage());  
  173.                     return false;  
  174.             }  
  175.         return true;  
  176.     }     
  177.      //关闭WiFi热点     
  178.     public void closeWifiAp() {          
  179.         if (getWifiAPState() != WIFI_AP_STATE_DISABLED) {      
  180.             try {      
  181.                 Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");      
  182.                 method.setAccessible(true);      
  183.                 WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);      
  184.                 Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.classboolean.class);      
  185.                 method2.invoke(mWifiManager, config, false);      
  186.             } catch (NoSuchMethodException e) {      
  187.                 e.printStackTrace();      
  188.             } catch (IllegalArgumentException e) {      
  189.                 e.printStackTrace();      
  190.             } catch (IllegalAccessException e) {      
  191.                 e.printStackTrace();      
  192.             } catch (InvocationTargetException e) {      
  193.                 e.printStackTrace();      
  194.             }      
  195.         }     
  196.     }    
  197.   
  198.     public void regitsterHandler(Handler handler){  
  199.         mHandler = handler;  
  200.     }  
  201.     public void unregitsterHandler(){  
  202.         mHandler = null;  
  203.     }  
  204.     //监听wifi热点状态变化  
  205.     private BroadcastReceiver mWifiStateBroadcastReceiver = new BroadcastReceiver() {             
  206.         @Override  
  207.         public void onReceive(Context context, Intent intent) {  
  208.         if(DEBUG)Log.i(TAG,"WifiAPUtils onReceive: "+intent.getAction());  
  209.         if(WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {  
  210.             int cstate = intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1);  
  211.             if(cstate == WIFI_AP_STATE_ENABLED) {  
  212.                 if(mHandler != null){  
  213.                     mHandler.sendEmptyMessage(MESSAGE_AP_STATE_ENABLED);                  
  214.                 }  
  215.             }if(cstate == WIFI_AP_STATE_DISABLED  || cstate == WIFI_AP_STATE_FAILED) {  
  216.             if(mHandler != null)  
  217.                 mHandler.sendEmptyMessage(MESSAGE_AP_STATE_FAILED);  
  218.             }  
  219.         }  
  220.         }  
  221.     };  
  222.     //获取热点ssid  
  223.     public String getValidApSsid() {  
  224.         try {  
  225.             Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");  
  226.             WifiConfiguration configuration = (WifiConfiguration)method.invoke(mWifiManager);  
  227.             return configuration.SSID;    
  228.         } catch (Exception e) {  
  229.                 Log.e(TAG, e.getMessage());  
  230.                 return null;  
  231.                 }  
  232.     }  
  233.     //获取热点密码  
  234.     public String getValidPassword(){  
  235.         try {  
  236.             Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");  
  237.             WifiConfiguration configuration = (WifiConfiguration)method.invoke(mWifiManager);  
  238.             return configuration.preSharedKey;    
  239.         } catch (Exception e) {  
  240.                 Log.e(TAG, e.getMessage());  
  241.                 return null;  
  242.                 }  
  243.       
  244.     }  
  245.     //获取热点安全类型  
  246.     public int getValidSecurity(){  
  247.         WifiConfiguration configuration;  
  248.         try {  
  249.             Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");  
  250.             configuration = (WifiConfiguration)method.invoke(mWifiManager);  
  251.         } catch (Exception e) {  
  252.                 Log.e(TAG, e.getMessage());  
  253.                 return WifiSecurityType.WIFICIPHER_INVALID.ordinal();  
  254.                 }  
  255.           
  256.         if(DEBUG)Log.i(TAG,"getSecurity security="+configuration.allowedKeyManagement);  
  257.         if(configuration.allowedKeyManagement.get(KeyMgmt.NONE)) {  
  258.             return WifiSecurityType.WIFICIPHER_NOPASS.ordinal();  
  259.         }else if(configuration.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {  
  260.             return WifiSecurityType.WIFICIPHER_WPA.ordinal();  
  261.         }else if(configuration.allowedKeyManagement.get(4)) { //4 means WPA2_PSK   
  262.             return WifiSecurityType.WIFICIPHER_WPA2.ordinal();  
  263.         }  
  264.         return WifiSecurityType.WIFICIPHER_INVALID.ordinal();  
  265.     }  
  266. }  

使用方法:

Activity生命周期中

[java]  view plain  copy
 print ?
  1. //初始化WifiAPUtil类  
  2. WifiAPUtil.getInstance(getApplicationContext())  
  3. //注册handler  
  4. WifiAPUtil.getInstance(this).regitsterHandler(mHandler);  
  5. //接收message,做处理  
  6. private Handler mHandler = new Handler(){  
  7.     public void handleMessage(Message msg) {  
  8.         switch (msg.what) {  
  9.             case WifiAPUtil.MESSAGE_AP_STATE_ENABLED:  
  10.                 String ssid = WifiAPUtil.getInstance(WifiApActivity.this).getValidApSsid();  
  11.                 String pw = WifiAPUtil.getInstance(WifiApActivity.this).getValidPassword();  
  12.                 int security = WifiAPUtil.getInstance(WifiApActivity.this).getValidSecurity();  
  13.                 mWifiApState.setText("wifi热点开启成功"+"\n"  
  14.                         +"SSID = "+ssid+"\n"  
  15.                         +"Password = "+pw +"\n"  
  16.                         +"Security = "+security);  
  17.                 break;  
  18.             case WifiAPUtil.MESSAGE_AP_STATE_FAILED:  
  19.                 mWifiApState.setText("wifi热点关闭");  
  20.                 break;  
  21.             default:  
  22.                 break;  
  23.         }  
  24.     }  
  25. };  
在activity销毁的时候

[java]  view plain  copy
 print ?
  1. @Override  
  2. protected void onDestroy() {  
  3.     super.onDestroy();  
  4.     WifiAPUtil.getInstance(this).unregitsterHandler();  
  5. }  
添加点击事件

[java]  view plain  copy
 print ?
  1. //开启wifi热点  
  2. WifiAPUtil.getInstance(WifiApActivity.this).turnOnWifiAp(ssid, password, mWifiType);  

[java]  view plain  copy
 print ?
  1. //关闭wifi热点  
  2. WifiAPUtil.getInstance(WifiApActivity.this).closeWifiAp();  

2 监听热点的状态

当wifi热点状态发送变化,系统会发送广播 Android.net.wifi.WIFI_AP_STATE_CHANGED,所以我们只要注册监听这个广播就可以了。

wifi ap状态值。

[java]  view plain  copy
 print ?
  1. public static final String EXTRA_WIFI_AP_STATE = "wifi_state";  
  2. public static int WIFI_AP_STATE_DISABLING = 10;  
  3. public static int WIFI_AP_STATE_DISABLED = 11;  
  4. public static int WIFI_AP_STATE_ENABLING = 12;  
  5. public static int WIFI_AP_STATE_ENABLED = 13;  
  6. public static int WIFI_AP_STATE_FAILED = 14;  
动态注册

[java]  view plain  copy
 print ?
  1. public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";  
  2. //注册广播接收者  
  3. IntentFilter filter = new IntentFilter();  
  4. filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);  
  5. context.registerReceiver(mWifiStateBroadcastReceiver, filter);  
广播接收者

通过监听wifiap状态的变化,发送消息给相关activity

[java]  view plain  copy
 print ?
  1. //监听wifi热点状态变化  
  2. private BroadcastReceiver mWifiStateBroadcastReceiver = new BroadcastReceiver() {             
  3.     @Override  
  4.         public void onReceive(Context context, Intent intent) {  
  5.     if(DEBUG)Log.i(TAG,"WifiAPUtils onReceive: "+intent.getAction());  
  6.     if(WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {  
  7.             int cstate = intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1);  
  8.             if(cstate == WIFI_AP_STATE_ENABLED) {  
  9.                 if(mHandler != null){  
  10.                     mHandler.sendEmptyMessage(MESSAGE_AP_STATE_ENABLED);                  
  11.                 }  
  12.             }if(cstate == WIFI_AP_STATE_DISABLED  || cstate == WIFI_AP_STATE_FAILED) {  
  13.             if(mHandler != null)  
  14.                 mHandler.sendEmptyMessage(MESSAGE_AP_STATE_FAILED);  
  15.             }  
  16.         }  
  17.      }  
  18. };  

3 遗留问题

在配置wificonfiguration的时候有过属性是hiddenSSID,这个是设置wifi热点AP是否隐藏的,

但是设置wcfg.hiddenSSID = true或false并没有发现有什么不同,按理说设置为true,ssid隐藏应该搜索不到这个热点,

但是都可以搜索到。还请知道的可以留言指教,十分感谢。


之前有朋友说5.0系统的开启热点有问题,我这里没有5.0的手机,使用华为p9Android6.0手机测试确实开启不了热点,需要添加write_settings,添加上此权限就可以成功开启了。

DEMO下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值