专栏首页程序猿的那点事LocalOnlyHotspot学习总结

LocalOnlyHotspot学习总结

前言:最近项目用到了LocalOnlyHotspot,做Wifi半年了也是第一次接触,在这里把最近俩周的学习内容做个总结。

LocalOnlyHotspot也是一种热点,通过startLocalOnlyHotspot接口打开。打开之后手机的热点图标也会亮起。

下面先看一段官方介绍:

Android P 新增应用API以实现本地协同的多个设备进行内容共享。应用程序可使用该API建立本地SoftAP(不可以共享internet上网),该功能可实现多个应用程序共享同一个LOHS。 通过共享同一个LOHS,多个设备之间不仅可以实现协同播放,还可以进行游戏的局域对战,增强了多个设备之间同个应用程序的互动性。

源码分析

先看startLocalOnlyHotspot代码,参数是LocalOnlyHotspotCallback ,这是一个应用程序的回调类,以接收有关LocalOnlyHotspot状态的更新。

public void startLocalOnlyHotspot(LocalOnlyHotspotCallback callback,
            @Nullable Handler handler) {
        synchronized (mLock) {
            Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper();
            LocalOnlyHotspotCallbackProxy proxy =
                    new LocalOnlyHotspotCallbackProxy(this, looper, callback);
            try {
                String packageName = mContext.getOpPackageName();
                int returnCode = mService.startLocalOnlyHotspot(
                        proxy.getMessenger(), new Binder(), packageName);
                if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) {
                    // Send message to the proxy to make sure we call back on the correct thread
                    proxy.notifyFailed(returnCode);
                    return;
                }
                mLOHSCallbackProxy = proxy;
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

看一下LocalOnlyHotspotCallback 这个类。一共有三个函数,对应热点的状态,相应的处理就写在这三个函数里。它的用法一般是在使用startLocalOnlyHotspot函数时,在startLocalOnlyHotspot参数里直接new一个LocalOnlyHotspotCallback 对象,重写他的方法。

public static class LocalOnlyHotspotCallback {
        /** @hide */
        public static final int REQUEST_REGISTERED = 0;

        public static final int ERROR_NO_CHANNEL = 1;
        public static final int ERROR_GENERIC = 2;
        public static final int ERROR_INCOMPATIBLE_MODE = 3;
        public static final int ERROR_TETHERING_DISALLOWED = 4;
  
        public void onStarted(LocalOnlyHotspotReservation reservation) {};

        public void onStopped() {};

        public void onFailed(int reason) { };
    }

在LocalOnlyHotspotCallback的onStarted函数中,需要LocalOnlyHotspotReservation 参数,它有一个close()函数,用于关闭LocalOnlyHotspot,调用的是stopLocalOnlyHotspot函数。

public class LocalOnlyHotspotReservation implements AutoCloseable {

        private final CloseGuard mCloseGuard = CloseGuard.get();
        private final WifiConfiguration mConfig;

        /** @hide */
        @VisibleForTesting
        public LocalOnlyHotspotReservation(WifiConfiguration config) {
            mConfig = config;
            mCloseGuard.open("close");
        }

        public WifiConfiguration getWifiConfiguration() {
            return mConfig;
        }

        @Override
        public void close() {
            try {
                stopLocalOnlyHotspot();
                mCloseGuard.close();
            } catch (Exception e) {
                Log.e(TAG, "Failed to stop Local Only Hotspot.");
            }
        }

        @Override
        protected void finalize() throws Throwable {
            try {
                if (mCloseGuard != null) {
                    mCloseGuard.warnIfOpen();
                }
                close();
            } finally {
                super.finalize();
            }
        }
    }

LocalOnlyHotspot与普通hotspot区别:

1、LocalOnlyHotspot开启的热点没有网络。 2、LocalOnlyHotspot开启以后,开启它的程序进入后台,热点几秒后就会自动关闭,不管有没有人连。

下面是我写的一个test app。

mainActivity主要代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
        mWifiConfiguration = new WifiConfiguration();
        mSwitch = (Switch) findViewById(R.id.switch_localonlyhotspot);
        startState = mWifiManager.isWifiApEnabled();
        mSwitch.setChecked(startState);
        mLocalOnlyHotspotReservation = mWifiManager.new LocalOnlyHotspotReservation(mWifiConfiguration);
        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    mWifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {
                        @Override
                        public void onStarted(LocalOnlyHotspotReservation reservation) {
                            super.onStarted(reservation);
                            ssid = reservation.getWifiConfiguration().SSID;
                            pwd = reservation.getWifiConfiguration().preSharedKey;
                            ipConfiguration = reservation.getWifiConfiguration().getIpConfiguration();
                            Log.e("SetLocalOnlyHotSpotController", "ssid and pwd is" + ssid + "and" + pwd + "and" + ipConfiguration);
                       }

                       @Override
                       public void onStopped() {
                 
                           super.onStopped();
                       }

                       @Override
                       public void onFailed(int reason) {
                           super.onFailed(reason);
                       }
                    }, new Handler());
                } else {
                    mLocalOnlyHotspotReservation.close();
                }
            }
        });

需要定位权限,不仅仅在Androidmainfest中加权限,在手机中还要给这个应用程序定位的权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

续:针对热点自动关闭和无法访问外网的问题,后面做了总结。 https://blog.csdn.net/qq_43804080/article/details/102844381

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android11 WiFi相关代码改动记录

    Android11已经发布,WiFi相关代码改动不大,在这里记录一下,方便日后做开发。

    用户7557625
  • Android实时获取热点已连接数(谷歌现成API可用,适用于第三方APP和系统APP)

    获取手机热点当前已连接数,目前网上大多数思路是通过读取/proc/net/arp文件可以得到连接当前热点的设备的IP,通过遍历来获取已连接数。但其实这种做法是有...

    用户7557625
  • ListPreference详解与使用

    listprefenence比switchpreference多了一个arrays.xml,这个arrays.xml就是用来写我们需要的list的内容。 以切...

    用户7557625
  • 用最简单的例子说明设计模式(二)之模版方法、策略模式、组合模式、观察者模式

    六月的雨
  • 在线教育平台开发中,如何接入sdk实现小班课

    在线教育平台开发过程中,有些功能并不是通过公司一手打造的,而是通过接入第三方实现的,因为相比于重新开发,接入第三方反而更加保险和稳定,接下来,小编将以声网sdk...

    万岳教育系统
  • 仿网易栏目添加功能

    在qq群里面发现一个小伙伴有需要做类似于网易新闻客户端栏目拖拽添加的这种效果,特意做了类似效果,效果图如下(文章结尾有源码链接): ? ? ? ? 实现了点击...

    用户1337002
  • 设计模式:模板方法

    模板方法 使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。 代码解释 可以...

    用户1172465
  • 10个重构小技巧,去掉代码中的S味

    本次我们抛开 JAVA 虚拟机源码这些相对底层的东西,来与各位探讨一下几个代码重构的小技巧。重构的手法有很多种,相对而言,一篇文章的涵盖量自然是无法提到所有,这...

    田维常
  • 仿网易新闻的顶部导航指示器

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details...

    用户2965908
  • 【Java学习笔记之七】java函数的语法规则总结

    函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券