好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

调用API设置安卓手机的Access Point

调用API设置安卓手机的Access Point

调用API设置安卓手机的Access Point

最近在做一个小的应用,需要通过程序设置安卓手机的AP(Access point, 即将手机变为一个移动热点,其他机器能够通过wifi连接到此手机)。原以为很简单的一个东西,还是花费了一番周折,最终还是搞定了。

配置AP的选项是属于配置wifi的一部分,所以他们都在WifiManager这个类中。 获取当前系统的WifiManager实例的方法是:

 1 
   WifiManager   wifi   =   (  WifiManager  )   getSystemService  (  Context  .  WIFI_SERVICE  ); 
  

此类中有几个关键方法用来设置AP,但是它们都是被隐藏的,我们无法直接调用,所以只有通过反射的方式来调用。

获取AP当前状态的方法是:

 1 
 2 
 3 
 4 
   private   Boolean   getApState  (  WifiManager   wifi  )   throws   NoSuchMethodException  ,   IllegalAccessException  ,   InvocationTargetException   { 
           Method   method   =   wifi  .  getClass  ().  getMethod  (  "isWifiApEnabled"  ); 
           return   (  Boolean  )   method  .  invoke  (  wifi  ); 
       } 
  

配置AP要使用到WifiConfiguration这个类,以下是设置的一个AP。

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
   private   WifiConfiguration   getApConfiguration  ()   { 
           WifiConfiguration   apConfig   =   new   WifiConfiguration  (); 
           //配置热点的名称 
           apConfig  .  SSID   =   "yourId"  ; 
           apConfig  .  allowedAuthAlgorithms  .  set  (  WifiConfiguration  .  AuthAlgorithm  .  OPEN  ); 
           apConfig  .  allowedKeyManagement  .  set  (  WifiConfiguration  .  KeyMgmt  .  WPA_PSK  ); 
           apConfig  .  allowedProtocols  .  set  (  WifiConfiguration  .  Protocol  .  RSN  ); 
           apConfig  .  allowedProtocols  .  set  (  WifiConfiguration  .  Protocol  .  WPA  ); 
           //配置热点的密码 
           apConfig  .  preSharedKey   =   "yourPassword"  ; 
           return   apConfig  ; 
       } 
  

应用AP配置并启用AP要使用另一个被隐藏的方法 setWifiApEnabled 。 需要注意的是启用AP前要将当前手机的wifi关闭,否则会启动失败。

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
       private   void   setWifiAp  ()   { 
           Method   method   =   wifi  .  getClass  ().  getMethod  ( 
                   "setWifiApEnabled"  ,   WifiConfiguration  .  class  ,   Boolean  .  TYPE  ); 
           wifi  .  setWifiEnabled  (  false  ); 
           method  .  invoke  (  wifi  ,   null  ,   true  ); 
       } 
  

最后,一定要注意要在AndroidManifest.xml文件中设置几个权限。否则在调用API时会产生 java.lang.SecurityException: Permission Denied 的异常。 需要加入的权限如下:

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

源码我已经放置到github上了,需要的请自行checkout。地址是: https://github.com/huangbowen521/APSwitch

作者: 黄博文 @无敌北瓜  
出处: http://www.cnblogs.com/huang0925
黄博文的地盘
本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

分类:  Android

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于调用API设置安卓手机的Access Point的详细内容...

  阅读:37次