`

调用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>

本文链接

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics