我们先来看一下WifiDisplay的代码,先从UI看起。
WifiDisplay是在Wifi P2P的基础上发展而来的,他的功能实现也离不开P2P。所以在WifiDisplaySettings的onCreate中,就先初始化了WifiP2P。
/packages/apps/Settings/src/com/android/settings/wfd/WifiDisplaySettings.java

    @Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);final Context context = getActivity();mRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);mWifiP2pManager = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE);mWifiP2pChannel = mWifiP2pManager.initialize(context, Looper.getMainLooper(), null);addPreferencesFromResource(R.xml.wifi_display_settings);setHasOptionsMenu(true);}

然后找到开启投屏的开关组件,check以后,修改数据库相关参数WIFI_DISPLAY_ON,从false置为true。

    @Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case MENU_ID_ENABLE_WIFI_DISPLAY:mWifiDisplayOnSetting = !item.isChecked();item.setChecked(mWifiDisplayOnSetting);Settings.Global.putInt(getContentResolver(),Settings.Global.WIFI_DISPLAY_ON, mWifiDisplayOnSetting ? 1 : 0);return true;}return super.onOptionsItemSelected(item);}

WifiDisplayController中从数据库查询WIFI_DISPLAY_ON参数,如果为true,表示开启WifiDisplay,然后开始一系列操作。
/frameworks/base/services/core/java/com/android/server/display/WifiDisplayController.java

    private void updateSettings() {final ContentResolver resolver = mContext.getContentResolver();mWifiDisplayOnSetting = Settings.Global.getInt(resolver,Settings.Global.WIFI_DISPLAY_ON, 0) != 0;

首先是修改状态,然后修改wfdinfo的相关配置信息。 WifiP2PManager也要进行相关配置,主要是setWFDInfo。

    private void updateWfdEnableState() {if (mWifiDisplayOnSetting && mWifiP2pEnabled) {// WFD should be enabled.if (!mWfdEnabled && !mWfdEnabling) {mWfdEnabling = true;WifiP2pWfdInfo wfdInfo = new WifiP2pWfdInfo();wfdInfo.setWfdEnabled(true);wfdInfo.setDeviceType(WifiP2pWfdInfo.WFD_SOURCE);wfdInfo.setSessionAvailable(true);wfdInfo.setControlPort(DEFAULT_CONTROL_PORT);wfdInfo.setMaxThroughput(MAX_THROUGHPUT);mWifiP2pManager.setWFDInfo(mWifiP2pChannel, wfdInfo, new ActionListener() {@Overridepublic void onSuccess() {if (DEBUG) {Slog.d(TAG, "Successfully set WFD info.");}if (mWfdEnabling) {mWfdEnabling = false;mWfdEnabled = true;reportFeatureState();updateScanState();}}

我们看setWFDInfo函数,主要是调用WifiP2pServiceImpl的checkConfigureWifiDisplayPermission方法。

    public void setWFDInfo(Channel c, WifiP2pWfdInfo wfdInfo,ActionListener listener) {checkChannel(c);try {mService.checkConfigureWifiDisplayPermission();} catch (RemoteException e) {e.rethrowFromSystemServer();}c.mAsyncChannel.sendMessage(SET_WFD_INFO, 0, c.putListener(listener), wfdInfo);}

这里是检测wfd有没有相关的权限。
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java

    @Overridepublic void checkConfigureWifiDisplayPermission() {if (!getWfdPermission(Binder.getCallingUid())) {throw new SecurityException("Wifi Display Permission denied for uid = "+ Binder.getCallingUid());}}

然后执行完以后就执行到updateScanState,就到扫描阶段了
/frameworks/base/services/core/java/com/android/server/display/WifiDisplayController.java

    private void updateScanState() {if (mScanRequested && mWfdEnabled && mDesiredDevice == null) {if (!mDiscoverPeersInProgress) {Slog.i(TAG, "Starting Wifi display scan.");mDiscoverPeersInProgress = true;handleScanStarted();tryDiscoverPeers();}} else {if (mDiscoverPeersInProgress) {// Cancel automatic retry right away.mHandler.removeCallbacks(mDiscoverPeers);// Defer actually stopping discovery if we have a connection attempt in progress.// The wifi display connection attempt often fails if we are not in discovery// mode.  So we allow discovery to continue until we give up trying to connect.if (mDesiredDevice == null || mDesiredDevice == mConnectedDevice) {Slog.i(TAG, "Stopping Wifi display scan.");mDiscoverPeersInProgress = false;stopPeerDiscovery();handleScanFinished();}}}}

关注公众号,获取更多开发必备知识

WifiDisplay开启流程相关推荐

  1. 协同工作流引擎,开启流程优化新纪元

    2019独角兽企业重金招聘Python工程师标准>>> 协同工作流引擎(Synchro flow)是业界领先的企业业务流程自动化的基础平台产品以及企业流程再造的核心产品,提供以业务建 ...

  2. Android11 热点开启流程

    Android11 热点开启流程 文章目录 Android11 热点开启流程 一.应用中热点开启和关闭的代码: 二.系统源码追踪 1.ConnectivityManager.startTetherin ...

  3. android9.0蓝牙功能,Android9.0 蓝牙开启流程

    微信扫码,给个关注吧 第一次接触蓝牙,先从蓝牙的开启流程入手吧,借此顺便熟悉一下蓝牙的代码架构. 1.UI /packages/apps/Settings/src/com/android/settin ...

  4. Android 11 WiFi开启流程

    从刚接触WiFi时跟过wifi的开启流程,当时还是android9.到了Android11代码架构有了不小的改动,在这里重新梳理一遍,便于在工作中更快速的跟踪代码. 一.Settings里改动不大,还 ...

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

    今天主要分析下Tethering.java这个文件: 这边netd和NetworkManagerService简单说下,详细分析后续会有.netd,NetworkManagerService和vold ...

  6. (七十一)Android O WiFi热点 开启流程梳理

    前言:之前主要梳理了WiFi开启扫描连接的流程,现在梳理下WiFi 热点 的开启流程. 时序图mdj样式:https://download.csdn.net/download/sinat_200594 ...

  7. andriod R wifi 开启流程

    前言: wifi chip 的开机初始化流程在这里我们就后面加上,本博客就暂时只有wifi的开启到wifi的连接成功. 虽然都是andriod R,但是还是有可能不同的基线版本代码还是有些许差别,所以 ...

  8. (九十七)Android O WiFi热点 开启流程梳理续(二)

    前言:从之前WiFi的连接流程可以知道WiFi最后一步会和服务端进行dhcp以获取ip地址,那么WiFi热点开启的时候应该也要配置相关dhcp属性,以供后续WiFi连接的时候ip分配,根据这块流程继续 ...

  9. adb fastboot 模式开启流程

    Android 的 fastboot 模式: 主要是解锁一些系统只读目录的写权限,例如在单编一些系统级App导入设备验证一些效果的时候,无法正常安装,使用fastboot模式可以节省很多时间,或者一些 ...

最新文章

  1. 简简单单实践ERD Commander2005破解Windows密码
  2. 暗通道优先的图像去雾算法(上)
  3. ITK:与矢量型图像应用GradientRecursiveGaussianImageFilter
  4. Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)
  5. 基于SDN的应用定义安全方案
  6. 测试开发面试准备之Selenium 工作原理
  7. 如何用Jquery做图片展示效果
  8. 测试wcf的http和tcp绑定以及非wcf的命名管道传输文件速度对比
  9. 分布式存储系统学习笔记(一)—什么是分布式系统(2)—数据分布
  10. 列举微型计算机的主要性能指标,计算机基础考试纲.ppt
  11. c语言教材1-8章参考答案,C语言课后习题参考答案(第1-8章)
  12. 网线转RS232如何接线
  13. 2021全国大学生电子设计竞赛F题(智能送药小车)国一赛后总结
  14. 华为服务器修改root密码,华为云 服务器重置root密码
  15. Redis server response timeout (3000 ms) occured for command: 错位主要是set数据超长了
  16. echarts饼图中间默认内容显示与data数据显示切换
  17. 手机用久了耗电快?华为手机的后备隐藏能源,开启后续航强如新机
  18. tomcat上部署的solr的移植以及数据的备份与恢复
  19. Jfrog:烂泥蛙安装
  20. c#考试,答题系统制作(窗体)

热门文章

  1. 解决windows系统powershell命令行无法使用代理的问题
  2. 随机梯度下降C语言,梯度下降法Gradient descent(最速下降法Steepest Descent)
  3. C语言中求指定位数的水仙花数
  4. 做自媒体影视短视频剪辑号,在哪儿下载素材?
  5. java 前后台json的传递
  6. 局域网远程连接另一台电脑
  7. 网站最下方必须显示您的备案号,并能链接到工信部网站,怎么操作?
  8. python学习===从键盘输入一些字符,逐个把它们写到磁盘文件上,直到输入一个 # 为止。...
  9. 不定方程非负整数解个数
  10. java iot框架_物联网开源框架Thingsboard使用总结