Android SoftAp支持 (二)

原创 2013年12月03日 16:21:31

SoftAp界面开启流程(让你的手机支持SoftAp功能)

市面上大多数手机支持SoftAp功能,有少数手机没有打开SoftAp的界面设置,所以无法开启此功能(当然有些山寨手机平板打开了此设置功能也不一定能使用SoftAP,因为此功能需要WIFI芯片与WIFI驱动的支持才能真正意义上实现)。

深入代码介绍一下手机 Portable Wi-Fi hostpot 界面开启条件

上文《Android SoftAp支持 (一)》提到当勾选Portable Wi-Fi hostpot,系统的Setting程序TetherSettings.java将响应此动作。tether这个词意思是拴绳,拴住的意思,理解起来有点晦涩,这里我的理解是分享的意思,比如 WIFI_TETHERING(用WIFI分享网路),  USB_TETHERING(用USB分享网络)……

那么这些网络分享如何满足什么条件才开启呢?疑问

从WirelessSettings开始说

在packages/apps/Settings/src/com/android/settings/WirelessSettings.java 的onCreate方法中会去检测系统是否Tether

       // Disable Tethering if it's not allowed or if it's a wifi-only device
        ConnectivityManager cm =       
                (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (isSecondaryUser || !cm.isTetheringSupported()) {
            getPreferenceScreen().removePreference(findPreference(KEY_TETHER_SETTINGS));
        } else {
            Preference p = findPreference(KEY_TETHER_SETTINGS);
            p.setTitle(Utils.getTetheringLabel(cm));
        }
        protectByRestrictions(KEY_TETHER_SETTINGS);

1)调用获取ConnectivityManager实例对象,并调用isTetheringSupported方法来检测是否支持Tether

2)调用getTetheringLabel查看支持哪些网络共享方式,并显示到界面

先看isTetheringSupported方法

    public boolean isTetheringSupported() {
        try {
            return mService.isTetheringSupported();
        } catch (RemoteException e) {  
            return false;
            ...

它调用了frameworks/base/services/java/com/android/server/ConnectivityService.java 的isTetheringSupported 方法

    public boolean isTetheringSupported() {
        enforceTetherAccessPermission();
        int defaultVal = (SystemProperties.get("ro.tether.denied").equals("true") ? 0 : 1);
        boolean tetherEnabledInSettings = (Settings.Global.getInt(mContext.getContentResolver(),
                Settings.Global.TETHER_SUPPORTED, defaultVal) != 0);
        return tetherEnabledInSettings && ((mTethering.getTetherableUsbRegexs().length != 0 ||
                mTethering.getTetherableWifiRegexs().length != 0 ||
                mTethering.getTetherableBluetoothRegexs().length != 0) &&
                mTethering.getUpstreamIfaceTypes().length != 0);
    }  
读取系统ro.tether.denied的属性,返回true则表示关闭tether功能,返回false表示打开tether功能。(有些设备不能显示portable wifi 就是因为此属性返回true,这里需要修改设置为false)

之后会检测是否有配置文件配置了tether,有则使用设置的值,没有查询到配置这使用查询ro.tether.denied属性的默认值。

这里我们假设得到的tetherEnableInSettings为ture,也不意味着就能正确打开Portable Wi-Fi hostpot 界面。因为还需要检测是否支持WIFI网络共享配置

mTethering.getTetherableWifiRegexs().length!=0 检测是否支持网络共享配置,这里Android4.4 与之前的版本有一定区别,但总体不变,大家可以参考其他代码做一些变通

getTetherableWifiRegexs()方法

frameworks/base/services/java/com/android/server/connectivity/Tethering.java
return mTetherableWifiRegexs;
直接返回了一个变量。 此变量在frameworks/base/services/java/com/android/server/connectivity/Tethering.java 

updateConfiguration()方法中赋值

mTetherableWifiRegexs = tetherableWifiRegexs;
而 tetherableWifiRegexs变量赋值也在此方法中

String[] tetherableWifiRegexs = mContext.getResources().getStringArray(
            com.android.internal.R.array.config_tether_wifi_regexs);

这里的config_tether_wifi_regexs数组由配置文件生成

配置文件config.xml

frameworks/base/core/res/res/values/config.xml

    <!-- List of regexpressions describing the interface (if any) that represent tetherable
         Wifi interfaces.  If the device doesn't want to support tethering over Wifi this
         should be empty.  An example would be "softap.*" -->
    <string-array translatable="false" name="config_tether_wifi_regexs">
    </string-array>

这里看到需要在此默认的config.xml中的   name="config_tether_wifi_regexs" 子标签下添加用作softap的接口(一般为wlan0 或者eth0 视你的WIFI驱动程序而定)

修改后的标签:

    <!-- List of regexpressions describing the interface (if any) that represent tetherable
         Wifi interfaces.  If the device doesn't want to support tethering over Wifi this
         should be empty.  An example would be "softap.*" -->
    <string-array translatable="false" name="config_tether_wifi_regexs">
    <item>"wlan0"</item>
    </string-array>

OK 此处mTethering.getTetherableWifiRegexs().length!=0 返回true, 整个isTetheringSupported 返回真

p.setTitle(Utils.getTetheringLabel(cm))

packages/apps/Settings/src/com/android/settings/WirelessSettings.java 调用到else中的

p.setTitle(Utils.getTetheringLabel(cm));函数

首先看packages/apps/Settings/src/com/android/settings/Utils.java 下的

getTetheringLabel 方法

/**
 * Return string resource that best describes combination of tethering
 * options available on this device.
 */
    
public static int getTetheringLabel(ConnectivityManager cm) {
    String[] usbRegexs = cm.getTetherableUsbRegexs();
    String[] wifiRegexs = cm.getTetherableWifiRegexs();
    String[] bluetoothRegexs = cm.getTetherableBluetoothRegexs();

    boolean usbAvailable = usbRegexs.length != 0;
    boolean wifiAvailable = wifiRegexs.length != 0;
    boolean bluetoothAvailable = bluetoothRegexs.length != 0;

    if (wifiAvailable && usbAvailable && bluetoothAvailable) {
        return R.string.tether_settings_title_all;
    } else if (wifiAvailable && usbAvailable) {
        return R.string.tether_settings_title_all;
    } else if (wifiAvailable && bluetoothAvailable) {
        return R.string.tether_settings_title_all;
    } else if (wifiAvailable) {
        return R.string.tether_settings_title_wifi;
    } else if (usbAvailable && bluetoothAvailable) {
        ...
}

这里  cm.getTetherableWifiRegexs();最终会调用到frameworks/base/services/java/com/android/server/connectivity/Tethering.java的 
getTetherableWifiRegexs()方法(与上相同,不再赘述) 


总结

讲到这里相信有些云里雾里了。

总结一下腰打开Portable Wi-Fi hostpot界面条件

需要确认:

1) 首先需要确认你的设备的WIFI芯片以及驱动是否支持softap

2) ro.tether.denied系统属性被设置为false(或者配置”tether_supported“标签并置1)

3) 在frameworks/base/core/res/res/values/config.xml  name="config_tether_wifi_regexs"标签下 添加做softap的接口

深入usb网络共享(一) usb共享的开启流程(and5.1)

今天主要分析下Tethering.java这个文件: 这边netd和NetworkManagerService简单说下,详细分析后续会有。netd,NetworkManagerService和vold...
  • kc58236582
  • kc58236582
  • 2015年09月09日 18:56
  • 3670

Android Softap开启流程分析

Android Wifi架构Android Softap开启流程Softap字面意思是用软件实现AP的功能,让你的移动设备可以作为一个路由,让别的站点链接。当你在手机或平板上通过按钮开启softap时...
  • u011012049
  • u011012049
  • 2017年06月06日 00:17
  • 870

android USB绑定(待补充)

android2.3添加usb绑定菜单:   1.   ro.tether.denied=false,可以在device/sec/products/sec_smdkc210.mk中加 2. ...
  • TheGameIsFives
  • TheGameIsFives
  • 2013年10月24日 13:48
  • 892

调通sina33下的AP6212A0(WIFI+BT)(分色排版)V1.3(android4.4.2)

调通sina33下的AP6212A0(WIFI+BT)     大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 wb4916 AT qq.com 完成时间:2017/6/28 12:13 版...
  • wb4916
  • wb4916
  • 2017年06月28日 18:05
  • 810

Android 蓝牙开发(十一)Pan蓝牙共享网络分析

本文主要分析Andorid蓝牙共享网络的使用、连接流程等。 基于Android4.3源码
  • VNanyesheshou
  • VNanyesheshou
  • 2017年05月23日 20:21
  • 10850

蓝牙PAN协议源码解析

1,概述 1.1 PAN协议 Dun协议: Dial_Up Networking Profile 拨号上网协议 PAN协议:Personal Area Networking Profile 个人...
  • u012439416
  • u012439416
  • 2017年01月11日 21:12
  • 1007

!!!!ap6212a0_a33_sc3817r_验证通过_修正wifi的配置文件为nvram_ap6212.txt

  • 2017年07月03日 15:57
  • 531KB
  • 下载

soft ap && wifi client

转载自:i绿茵漫如诗 本文档基于Android 2.3.4,描述wifi热点相关工作事宜 1.     将Android2.3.4设置里的便携式热点及相关配置显示出来。 ...
  • wyw594
  • wyw594
  • 2014年03月12日 17:47
  • 1401

Android系统去除蓝牙

删除蓝牙 niming@ubuntu:/home/user/workspace2/niming/a33-v2.0/android/packages/apps/Settings$ git diff ...
  • u011736532
  • u011736532
  • 2014年09月09日 17:32
  • 1146

Softap热点原理分析

Android4.1.2 设置中开关: packages/apps/Settings/src/com/android/settings/TetherSettings.java |----priv...
  • airk000
  • airk000
  • 2013年09月11日 16:33
  • 7077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SoftAp支持 (二)
举报原因:
原因补充:

(最多只允许输入30个字)