Android_OTT的wifi热点建立

来源:互联网 发布:海纳百川软件安卓版 编辑:程序博客网 时间:2024/06/05 09:46
最近几天公司要求做一个建立wifi热点的apk,看了下系统设置的源码和SDK,因为我做的开发是在OTT之上,所以结合OTT的特点,有如下总结。
wifi热点是将机顶盒的有线网络通过wifi来共享出来,就是将机顶盒虚拟成一个无线路由器,所以在建立wifi热点时机顶盒上的wifi状态是要关闭的,在开启热点之前要判断当前的有线连接是否是有效的,判断是否是connected。代码如下
// 判断当前是否联网,如果联网了。判断是不是eth
public boolean isAvailableEth() {
ConnectivityManager mConnManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mInfo = mConnManager.getActiveNetworkInfo();
if (mInfo != null) {
if (mInfo.isAvailable() && mInfo.isConnected() && !mInfo.getTypeName().equals("WIFI")) {
return true;
}
return false;
}
return false;

}


有关网络连接状态与connected和available的值的变化如下:

1,显示连接已保存,但标题栏没有,即没有实质连接上,输出为:not connect, available
2,显示连接已保存,标题栏也有已连接上的图标,      输出为:connect, available
3,选择不保存后                                    输出为:not connect, available
4,选择连接,在正在获取IP地址时                    输出为:not connect, not available
5,连接上后                                        输出为:connect, available


判断完之后,就可以设置了。有两种方式,一种是OPEN方式,即建立的wifi热点无需密码就可以登录,第二种是WPA2 PSK方式,即建立的wifi热点需要密码才可以登录。在开启热点的时候主要用到了WifiManager的隐藏方法setWifiApEnabled() ,该方法可以通过反射的方法来得到或者直接调用然后在源码环境下编译工程,这里我是用的反射的方法:
public boolean setWifiApEnabled(String ssid ,String key ,String security, boolean enabled) {
    mWifiConfig.SSID = ssid ;
    if(security.equals("open")){
    mWifiConfig.allowedKeyManagement.set(KeyMgmt.NONE);
    }else{
    mWifiConfig.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
    mWifiConfig.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
    mWifiConfig.preSharedKey = key ;
    }
        try {
            if (enabled) { // disable WiFi in any case
                mWifiManager.setWifiEnabled(false);
            }
            Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class,boolean.class);
            return (Boolean) method.invoke(mWifiManager, mWifiConfig, enabled);
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
    }
这里传的参数ssid:wifi热点的名字;key:wifi热点的密码;security:加密方式有open和wpa2 psk这两种;enabled:表示设置WifiAp的开关
那么,如何关闭wifi热点呢?这就跟enabled的值有关了。如下
public boolean closeAp(){
    try {
            Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class,boolean.class);
            return (Boolean) method.invoke(mWifiManager, null, false);
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
    }
  设置之后怎样查看wifi热点的状态呢?这里也要通过一个WifiManager的隐藏方式来获取,这个方法是getWifiApState()
//得到wifi热点当前的状态
    //WIFI_AP_STATE_DISABLING = 0;
    //WIFI_AP_STATE_DISABLED = 1;
    //WIFI_AP_STATE_ENABLING = 2;
    //WIFI_AP_STATE_ENABLED = 3;
    //WIFI_AP_STATE_FAILED = 4;
    public int getWifiApState() {
        try {
            Method method = mWifiManager.getClass().getMethod("getWifiApState");
            return (Integer) method.invoke(mWifiManager);
        } catch(Exception e) {
            e.printStackTrace();
            return WIFI_AP_STATE_FAILED;
        }
    }
好,到这里主要的功能需要的代码就差不多了。剩下的就是界面和存储信息的事情,应该还好。















原创粉丝点击