zoukankan      html  css  js  c++  java
  • 调用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
  • 相关阅读:
    ac与ap同步分析
    ipsec原理(转载)
    Sublime Text自定制代码片段(Code Snippets)
    IPsec分析/测试/
    jQuery 学习
    windows pip 安装 转载
    转载 pep8安装
    转载别人的ftp,觉得目录结构不错,学习
    博客园 CSS 代码定制
    AC自动机
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3119035.html
Copyright © 2011-2022 走看看