`

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

阅读更多
原帖地址:http://www.cnblogs.com/huang0925/archive/2013/06/05/3118693.html
<article class="hentry" role="article"><div class="entry-content"> <br><br><p>最近在做一个小的应用,需要通过程序设置安卓手机的AP(Access point, 即将手机变为一个移动热点,其他机器能够通过wifi连接到此手机)。原以为很简单的一个东西,还是花费了一番周折,最终还是搞定了。</p> <br><br><!-- more --><br><br><br><p>配置AP的选项是属于配置wifi的一部分,所以他们都在WifiManager这个类中。<br>获取当前系统的WifiManager实例的方法是:</p> <br><br><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr> <br><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span><br></pre></td> <br><td class="code"><pre><code class="java"><span class="line"><span class="n">WifiManager</span> <span class="n">wifi</span> <span class="o">=</span> <span class="o">(</span><span class="n">WifiManager</span><span class="o">)</span> <span class="n">getSystemService</span><span class="o">(</span><span class="n">Context</span><span class="o">.</span><span class="na">WIFI_SERVICE</span><span class="o">);</span><br></span></code></pre></td> <br> </tr></table></div></figure><p>此类中有几个关键方法用来设置AP,但是它们都是被隐藏的,我们无法直接调用,所以只有通过反射的方式来调用。</p> <br><br><p>获取AP当前状态的方法是:</p> <br><br><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr> <br><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></pre></td> <br><td class="code"><pre><code class="java"><span class="line"><span class="kd">private</span> <span class="n">Boolean</span> <span class="nf">getApState</span><span class="o">(</span><span class="n">WifiManager</span> <span class="n">wifi</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">NoSuchMethodException</span><span class="o">,</span> <span class="n">IllegalAccessException</span><span class="o">,</span> <span class="n">InvocationTargetException</span> <span class="o">{</span><br></span><span class="line"> <span class="n">Method</span> <span class="n">method</span> <span class="o">=</span> <span class="n">wifi</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getMethod</span><span class="o">(</span><span class="s">"isWifiApEnabled"</span><span class="o">);</span><br></span><span class="line"> <span class="k">return</span> <span class="o">(</span><span class="n">Boolean</span><span class="o">)</span> <span class="n">method</span><span class="o">.</span><span class="na">invoke</span><span class="o">(</span><span class="n">wifi</span><span class="o">);</span><br></span><span class="line"> <span class="o">}</span><br></span></code></pre></td> <br> </tr></table></div></figure><p>配置AP要使用到WifiConfiguration这个类,以下是设置的一个AP。</p> <br><br><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr> <br><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></pre></td> <br><td class="code"><pre><code class="java"><span class="line"><span class="kd">private</span> <span class="n">WifiConfiguration</span> <span class="nf">getApConfiguration</span><span class="o">()</span> <span class="o">{</span><br></span><span class="line"> <span class="n">WifiConfiguration</span> <span class="n">apConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">WifiConfiguration</span><span class="o">();</span><br></span><span class="line"> <span class="c1">//配置热点的名称</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">SSID</span> <span class="o">=</span> <span class="s">"yourId"</span><span class="o">;</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">allowedAuthAlgorithms</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">WifiConfiguration</span><span class="o">.</span><span class="na">AuthAlgorithm</span><span class="o">.</span><span class="na">OPEN</span><span class="o">);</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">allowedKeyManagement</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">WifiConfiguration</span><span class="o">.</span><span class="na">KeyMgmt</span><span class="o">.</span><span class="na">WPA_PSK</span><span class="o">);</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">allowedProtocols</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">WifiConfiguration</span><span class="o">.</span><span class="na">Protocol</span><span class="o">.</span><span class="na">RSN</span><span class="o">);</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">allowedProtocols</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">WifiConfiguration</span><span class="o">.</span><span class="na">Protocol</span><span class="o">.</span><span class="na">WPA</span><span class="o">);</span><br></span><span class="line"> <span class="c1">//配置热点的密码</span><br></span><span class="line"> <span class="n">apConfig</span><span class="o">.</span><span class="na">preSharedKey</span> <span class="o">=</span> <span class="s">"yourPassword"</span><span class="o">;</span><br></span><span class="line"> <span class="k">return</span> <span class="n">apConfig</span><span class="o">;</span><br></span><span class="line"> <span class="o">}</span><br></span></code></pre></td> <br> </tr></table></div></figure><p>应用AP配置并启用AP要使用另一个被隐藏的方法<code>setWifiApEnabled</code>。<strong>需要注意的是启用AP前要将当前手机的wifi关闭,否则会启动失败。</strong></p> <br><br><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr> <br><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></pre></td> <br><td class="code"><pre><code class="java"><span class="line"> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">setWifiAp</span><span class="o">()</span> <span class="o">{</span><br></span><span class="line"><br></span><span class="line"><br></span><span class="line"> <span class="n">Method</span> <span class="n">method</span> <span class="o">=</span> <span class="n">wifi</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getMethod</span><span class="o">(</span><br></span><span class="line"> <span class="s">"setWifiApEnabled"</span><span class="o">,</span> <span class="n">WifiConfiguration</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">Boolean</span><span class="o">.</span><span class="na">TYPE</span><span class="o">);</span><br></span><span class="line"><br></span><span class="line"> <span class="n">wifi</span><span class="o">.</span><span class="na">setWifiEnabled</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span><br></span><span class="line"> <span class="n">method</span><span class="o">.</span><span class="na">invoke</span><span class="o">(</span><span class="n">wifi</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span><br></span><span class="line"> <span class="o">}</span><br></span></code></pre></td> <br> </tr></table></div></figure><p>最后,一定要注意要在AndroidManifest.xml文件中设置几个权限。否则在调用API时会产生<code>java.lang.SecurityException: Permission Denied</code>的异常。<br>需要加入的权限如下:</p> <br><br><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr> <br><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></pre></td> <br><td class="code"><pre><code class="xml"><span class="line"><span class="nt">&lt;uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.ACCESS_NETWORK_STATE"</span> <span class="nt">/&gt;</span><br></span><span class="line"><span class="nt">&lt;uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.ACCESS_WIFI_STATE"</span> <span class="nt">/&gt;</span><br></span><span class="line"><span class="nt">&lt;uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.CHANGE_WIFI_STATE"</span> <span class="nt">/&gt;</span><br></span><span class="line"><span class="nt">&lt;uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.CHANGE_NETWORK_STATE"</span> <span class="nt">/&gt;</span><br></span></code></pre></td> <br> </tr></table></div></figure><p>源码我已经放置到github上了,需要的请自行checkout。地址是:<a href="https://github.com/huangbowen521/APSwitch">https://github.com/huangbowen521/APSwitch</a></p> <br> </div></article>

本文链接

分享到:
评论

相关推荐

    android调用百度地图的覆盖层

    在Android开发中,集成地图功能是一项常见的需求,而百度地图API为开发者提供了丰富的地图操作接口。本篇将详细讲解如何在Android应用中调用百度地图并实现自定义覆盖层,以便将数据可视化地展示在地图上。 首先,...

    Android百度地图添加覆盖物

    在Android开发中,集成百度地图并添加覆盖物(也称为POI,Point of Interest)是一项常见的任务,可以为用户提供丰富的地理位置信息和交互功能。本文将详细介绍如何在Android应用中使用百度地图API实现这一功能。 ...

    android widget GRRS/3G(APN)上网开关

    本教程将聚焦于创建一个GRRS/3G(GPRS/EDGE和3G网络)APN(Access Point Name,接入点名称)上网开关的Android小部件。这个小部件允许用户快速切换移动数据连接,对于经常需要控制数据流量的用户非常实用。 首先,...

    Android开发之wifi.pdf

    WIFI技术允许设备通过无线方式连接到互联网,尤其在智能手机和平板电脑上广泛使用。Android系统为开发者提供了丰富的API来管理和操作WIFI功能。 首先,我们关注的是`ScanResult`类,它存储了关于检测到的WIFI接入点...

    android移动地图

    在Android平台上,移动地图开发是一项常见的任务,Google Maps API为开发者提供了强大的支持。"android移动地图"这个项目可能是一个小型的应用程序,它利用了Google Maps服务来展示地图、定位用户位置以及实现一些...

    Androd GPRS打开关闭

    - 对于Android 10及以上版本,由于谷歌限制了直接控制移动数据,可能需要借助设置APN(Access Point Name)的方式间接控制。 6. **GprsTest**: - 压缩包中的GprsTest可能是测试代码或应用,它可能包含实现上述...

    代码打开gprs、获取gps坐标

    这个过程可能涉及到设置APN(Access Point Name),建立TCP/IP连接,以及处理数据传输的安全性问题,如SSL/TLS加密。在Android平台上,我们可以使用`ConnectivityManager`和`NetworkInfo`类来检查和管理网络连接状态...

    关于cmwap网络切换

    CMWAP是GPRS(General Packet Radio Service)网络下的一种接入点名称(Access Point Name,简称APN),它是中国移动为用户提供的一种低带宽、低成本的互联网访问服务。相比于CMNET,CMWAP通常用于浏览网页、收发...

    Android平台上WiFi技术在商场员工定位系统中的应用.pdf

    在大型商场中,部署多个WiFi接入点(Access Point,AP),每个AP会发送无线信号,移动设备(如Android手机)可以接收到这些信号并测量其RSSI值。由于信号强度随距离的增加而减小,通过比较不同AP的RSSI值,可以估算...

    GPRS通信 C语言

    通过串口发送AT命令到GPRS模块,可以进行拨号、建立PPP连接、设置APN(Access Point Name)等操作。例如,"AT+CGDCONT=1,"IP","your.apn.name""用于设置APN,"ATD*99#"用于拨号建立PPP连接。 为了在Qt中发送AT命令...

    Android中获取设备的各种信息总结

    在Android中,获取某些设备信息可能需要特定的权限,如获取电话状态的`READ_PHONE_STATE`权限,访问网络的`ACCESS_NETWORK_STATE`或`INTERNET`权限等。确保在`AndroidManifest.xml`中声明这些权限。 总之,Android...

Global site tag (gtag.js) - Google Analytics