Android wifi热点开关代码记录

Android wifi热点开关代码记录

一、前言

wifi和热点开关的代码可以用WifiManager也可以调用ConnectivityManager的接口实现。

下面记录一下。

二、代码实现

1、wifi开关

    //wifi开关
    public static void setWifiState(Context context, boolean isSetWifiEnable) {
        WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        int wifiState = mWifiManager.getWifiState();
        DebugLog.debug("wifiState = " + wifiState + "(DISABLING = 0;DISABLED = 1;ENABLING = 2;ENABLED = 3;)");

        DebugLog.debug("set wifi =isSetWifiEnable" + isSetWifiEnable);
        mWifiManager.setWifiEnabled(isSetWifiEnable);
    }

2、热点开关

    //热点开关
    public static void setWifiApState(Context context, boolean isSetWifiApEnable) {
        WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        int apState = mWifiManager.getWifiApState();
        LogUtil.debug("apState = " + apState + "(DISABLING = 10;DISABLED = 11;ENABLING = 12;ENABLED = 13;)");

        LogUtil.debug("set wifi =isSetWifiApEnable" + isSetWifiApEnable);
        if (isSetWifiApEnable) {
            mWifiManager.startTetheredHotspot(null); //根据可以设置热点配置SoftApConfiguration对象信息
        } else {
            mWifiManager.stopSoftAp();
        }

    }

3、第二种方式开关热点


    //热点关闭2
    public static void stopHotSpot(Context context) {
        LogUtil.debug("stop hotspot.");
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
    }

    //热点开启2
    public static void startHotSpot(Context context, long delaytime) {
        LogUtil.debug("setup hotspot.");
        WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        int apState = mWifiManager.getWifiApState();
        LogUtil.debug("apState = " + apState + "(DISABLING = 10;DISABLED = 11;ENABLING = 12;ENABLED = 13;)");
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, true /* showProvisioningUi */, mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
    }


    //热点开启回调监听
    final static ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
            new ConnectivityManager.OnStartTetheringCallback() {
                @Override
                public void onTetheringFailed() {
                    super.onTetheringFailed();
                    LogUtil.error("onTetheringFailed");
                }

                @Override
                public void onTetheringStarted() {
                    super.onTetheringStarted();
                    LogUtil.debug("onTetheringStarted");
                }

            };

具体情况,热点的两种开启控制代码,看哪种方便就用哪种。
上面看起来是使用WifiManager调用的方式比较方便,
虽然官方是提示废弃的,但是系统系统应用还是可以正常调用。

两个对象的方法调用好像都是要系统权限的!所以普通应用基本无法调用!

三、其他

1、热点启动流程

(1)ConnectivityManager.startTethering
(2)TetheringManager.startTethering(request, executor, tetheringCallback)
(3)TetheringService.TetheringConnector.startTethering
(4)Tethering.startTethering(request, listener);
//方法名变化,使用null 对象开启热点
(5)WifiManager.startTetheredHotspot(null /* use existing softap config */)
(6)WifiServiceImpl.startTetheredHotspot(@Nullable SoftApConfiguration softApConfig) 
//方法名再变化
(7)ActiveModeWarden.startSoftAp(apModeConfig);
(8)ActiveModeManager.start();
    ActiveModeManager manager = mWifiInjector.makeSoftApManager(listener, callback, softApConfig);
        listener.setActiveModeManager(manager);
        manager.start();
ActiveModeManager是接口类,会调用到SoftApManager.start()
(9)SoftApManager.startSoftAp()
(10)WifiNative.startSoftAp(mApInterfaceName, localConfigBuilder.build(), mSoftApListener)
(11)HostapdHal.addAccessPoint(ifaceName, config, listener::onFailure)
(12)根据硬件版本调用不同的接口实现:addAccessPoint_X_X

可以看到ConnectivityManager的后续流程也是调用到WifiManager流程往下走。

详解:
https://blog.youkuaiyun.com/wenzhi20102321/article/details/128473734

http://blog.csdn.net/xiaoxiao108/article/details/31398127 现在用有线连网看视频速度要比经过路由器快,用无线做热点,但无线设置热点后,关机或重启又要再重新开启热点,这样比较麻烦,增加上开机自启热点,这样比较方便了,连网速度快看视频不卡其它设备也可以通过盒子上网。 开发工具 android ADT 实现方法 1.开启热点 2.开机启动 具体代码 1.开启热点 [java] view plaincopy在CODE上查看代码片派生到我的代码WifiManager wifiManager; wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); Method method = wifiManager.getClass().getMethod("getWifiApState"); int state = (Integer) method.invoke(wifiManager); if(state==13||state==12)// 已经开 或者 正在开 { }else { Toast.makeText(MainActivity.this,"正在开启AndroidAP...", 1).show(); wifiManager.setWifiEnabled(false); WifiConfiguration apConfig = new WifiConfiguration(); apConfig.SSID = "AndroidAP"; apConfig.allowedKeyManagement.set(4); apConfig.preSharedKey = "5e8918f37260"; method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE); boolean open = (Boolean) method.invoke(wifiManager, apConfig, true); } AndroidManifest.xml 中增加权限 2.开机启动 用了用 在我的电视盒子上试了试 发现 偶尔会出现 开机不自动运行的情况 换个思路把 用 替代 电视盒子自带的 桌面 开启AP热点后再 自动运行盒子自带的桌面 [java] view plaincopy在CODE上查看代码片派生到我的代码片 ComponentName componet = new ComponentName("com.duokan.duokantv","com.duokan.duokantv.MainActivity"); Intent i = new Intent(); i.setComponent(componet); startActivity(i); 使用方法 1.电视盒子连有线网 2.配置好盒子正常上网 3.安装自己写好的程序 如果你发现有什么不合理的,需要改进的地方,请留言。或者可以通过 328452421@qq.com 联系我,非常感谢。 http://blog.csdn.net/xiaoxiao108/article/details/31398127
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值