amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子
S905L3 带有投屏的功能,并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能,但是在测试中发现机顶盒关闭DLNA后,手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子,有时却很容易搜索到。
通过查看日志,发现打开和关闭盒子,com.droidlogic.mediacenter进程分别只有一条日志,线索有限。
行 266: 05-31 09:35:54.089 4603 4603 D WeakRefService: net.droidlogic.action.dlna state:true
行 1171: 05-31 09:36:04.272 4603 4603 D WeakRefService: net.droidlogic.action.dlna state:false
调试了盒子设置界面打开和关闭DLNA的流程,大概已经熟悉,但是没有找出关闭的流程有什么问题,设置APP的逻辑比较简单,接口jar包dlna.jar则代码较多,不太容易完全掌握其逻辑。难于定位是设置APP调用有问题还是调用的接口本身有问题。但是我想,虽然不知道关闭DLNA需要调用什么代码和接口,而且关闭会失败,很难定位关闭的正确流程。但是可以通过定位开机打开DLNA调用了什么接口,从而能猜测到关闭DLNA需要什么接口。
于是开机后打开DLNA, 一路的设置断点,且每个断点都在手机上确认能否搜到盒子,最后在adv.start()执行后,手机就能搜到盒子了。
public boolean start() {Debug.d("DEVICE", "========httpServerList.start");int retryCnt = 0;int bindPort = this.getHTTPPort();HTTPServerList httpServerList;for(httpServerList = this.getHTTPServerList(); !httpServerList.open(bindPort); bindPort = this.getHTTPPort()) {++retryCnt;if (100 < retryCnt) {return false;}this.setHTTPPort(bindPort + 1);}httpServerList.addRequestListener(this);httpServerList.start();Advertiser adv = new Advertiser(this);this.setAdvertiser(adv);adv.start();Debug.d("DEVICE", "========SSDPSearchSocketList.start");if (HostInterface.getAvailNet() != null && HostInterface.getAvailNet().length > 0) {this.setSSDPBindAddress(HostInterface.getAvailNet());}SSDPSearchSocketList ssdpSearchSockList = this.getSSDPSearchSocketList();if (!ssdpSearchSockList.open()) {return false;} else {ssdpSearchSockList.addSearchListener(this);ssdpSearchSockList.start();this.peers.clear();return true;}}
Advertiser继承线程类,start后整个线程就跑起来了。他的逻辑还是很清楚,先调用byebye,如果线程关联的设备跟其他设备绑定了,先解绑(花5秒钟),然后对外广播,设备激活了,之后每隔320秒广播一次。在这个类里面也能容易发现关闭DLNA要调用stopAdvertiser,再设置断点,发现调用stopAdvertiser后,这个线程停止不下来,于是还是会320秒广播一次。
public class Advertiser extends Thread
{private static Thread advertise;private Device device;public Advertiser(final Device dev) {this.setDevice(dev);}public void setDevice(final Device dev) {this.device = dev;}public Device getDevice() {return this.device;}public void stopAdvertiser() {if (Advertiser.advertise != null) {final Thread tmpThread = Advertiser.advertise;tmpThread.interrupt();Advertiser.advertise = null;}}@Overridepublic void run() {Advertiser.advertise = Thread.currentThread();this.getDevice().byebye();try {Thread.sleep(5000L);}catch (InterruptedException e) {e.printStackTrace();while (true) {this.getDevice().announce();try {Thread.sleep(320000L);}catch (InterruptedException ex) {break;}}}finally {while (true) {this.getDevice().announce();try {Thread.sleep(320000L);}catch (InterruptedException ex2) {}}}}static {Advertiser.advertise = null;}
}
在这里就可以发现问题的所在,当调用stopAdvertiser出发线程中断时,run 循环对InterruptedException 异常没有做任何处理,所以也不会停止,可以考虑捕获异常时,跳出循环。但是dlna.jar没有源码,只有jar包,因此要做反编译处理。
找到S905L3的编译环境,查看是用的jdk 8, 把该jdk加入到环境变量 PATH。
生成class文件,把dlna.jar拖入eclipse 或者 android studio, 找到相应的类,可以直接看到代码,然后把代码复制到一个空的Advertiser.java文件上,修改对应的逻辑。然后用命令: javac Advertiser.java, 生成新的Advertiser.class
第一次修改只在抛异常处增加break语句,但是编译后发现break语句会被优化掉,第二次修改把捕获中断异常放到循环外,问题得到解决。
//修改前try {Thread.sleep(5000L);}catch (InterruptedException e) {e.printStackTrace();while (true) {this.getDevice().announce();try {Thread.sleep(320000L);}catch (InterruptedException ex) {}}}//第一次修改try {Thread.sleep(5000L);}catch (InterruptedException e) {e.printStackTrace();while (true) {this.getDevice().announce();try {Thread.sleep(320000L);}catch (InterruptedException ex) { break;}}}//第二次修改try {Thread.sleep(5000L);while (true) {this.getDevice().announce();Thread.sleep(320000L);}}catch (InterruptedException e) {e.printStackTrace();}
解包:unzip dlna.jar
打包:把新的Advertiser.class替换到解包出来的文件夹, 用下命令打包:jar -uvf dlna.jar org/cybergarage/upnp/device/Advertiser.class。dlna.jar就由旧的dlna.jar变成了新的dlna.jar。
用新的dlna.jar编译设置APK,通过自测和测试复测,问题没有再出现。
相关文章:
amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子
S905L3 带有投屏的功能,并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能,但是在测试中发现机顶盒关闭DLNA后,手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子,…...
@Autowire、@Recourse用啥?
在使用IDEA写Spring相关的项目的时候,在字段上使用Autowired注解时,总是会有一个波浪线提示:Field injection is not recommended. 这是为啥呢?今天就来一探究竟。 众所周知,在Spring里面有三种可选的注入方式…...
[linux] 过滤警告⚠️
如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息,可以尝试以下方法: 使用warnings模块:导入warnings模块并设置warnings.filterwarnings("ignore"),这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...
Linux必备操作系统命令大全
一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数,只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数:目标目录名称。例如,若要进入 Document…...
【rtp】VideoTimingExtension 扩展的解析和写入
VideoTimingExtension 扩展有13个字节,并非都是字符串类型 class VideoTimingExtension {public:using value_type = VideoSendTiming;static constexpr RTPExtensionType kId = kRtpExtensionVideoTiming;static constexpr uint8_t kValueSizeBytes = 13...
网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
目录 前言 一、内容简介 二、读者对象 三、专家推荐 四、全书目录 前言 CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几个突出的问题࿱…...
Winform直接与Wpf交互
Winform项目中,可以直接使用wpf中的自定义控件和窗体 测试环境: vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下: 1 新建winfrom项目,名为WinFormDemo,默认有一个名为Form1的窗体…...
Uni-app 调用微信地图导航功能【有图】
前言 我们在使用uni-app时,有时候会遇到需要开发地图和导航的功能,这些方法其实微信小程序的API已经帮我们封装好了 详见:微信小程序开发文档 接下来我们就演示如何用uni-app来使用他们 使用 <template><view><button type…...
Golang slice 通过growslice调用nextslicecap计算扩容
先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8? append了的4个元素&…...
HTTP 协商缓存 Last-Modified,If-Modified-Since
浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone header加上Last-Modified属性(表示这个资源在服务器上的最后修改时间): ----------------------------------------------------------------…...
零基础教程:Yolov5模型改进-添加13种注意力机制
1.准备工作 先给出13种注意力机制的下载地址: https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例(不需要接收通道数的注意力机制) 1.在models文件下新建py文件,取名叫Sim…...
vue截取地址参数
const getQueryValueFn () >{// 获取当前页面的URLconst currentURL window.location.href;//创建一个URL对象来解析当前URL。URL对象提供了方便的属性和方法来处理URL的各个部分const url new URL(currentURL);// 使用URLSearchParams获取查询参数const queryParams ne…...
ubuntu 14.04更新GCC版本
按最基本的apt-get install gcc-8,不成功,提示如下。 按网上说的:apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后,发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接,镜像地…...
AndroidUtil - 强大易用的安卓工具类库
官网 https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md 项目介绍 AndroidUtilCode 🔥 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 API…...
[多态设计模式]枚举
背景: 游戏服务器中,多态可以说体现的淋漓尽致。 如: 1.开启条件。有的系统是根据玩家等级,有的是根据通关第几关。 2.商店可能有不同类型的商店。 3.任务系统中,不同的计数类型,不同的任务目标类型。…...
【QT】QRadioButton的使用(17)
QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行,那么,今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装:Download Pyt…...
力扣:105. 从前序与中序遍历序列构造二叉树(Python3)
题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 来源:力扣(LeetCode) 链接:力扣&am…...
【含java2023面试题】HashMap、HashTable、ConcurrentHashMap
作为Java中最常用的Map集合,HashMap、HashTable和ConcurrentHashMap都是线程安全的,但它们之间有什么区别呢?在本文中,我们将深入探讨这三种Map集合的区别,并通过Java代码示例来演示它们之间的差异。 AI绘画关于SD,MJ…...
AT24C02芯片
AT24C02简介: AT24C01/02/04/08/16...是一个 1K/2K/4K/8K/16K 位串行 CMOS内部有9个字节; 该器件通过 I2C 总线接口进行 操作,它有一个专门的写保护功能; 基于51 他有这个芯片操作 时序: AT24C02软件编程: …...
Python+Django前后端分离
程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjango前后端分离》编写代码,代码整洁,规则,易读。 学习与应…...
华为云Stack网络排障实战:用ovs-appctl命令追踪VXLAN隧道里的数据包(附详细命令解析)
华为云Stack网络排障实战:VXLAN隧道数据包追踪与流表解析 在云计算的复杂网络环境中,VXLAN技术已经成为构建大规模虚拟网络的核心方案。作为华为云Stack的运维工程师或网络管理员,掌握VXLAN隧道中的数据包追踪技术至关重要。本文将深入探讨如…...
ModelSim TCL脚本自动化仿真:从基础到IP核集成的实战指南
1. ModelSim TCL脚本自动化仿真入门 第一次接触ModelSim仿真时,我也像大多数人一样在GUI界面里手动添加文件、设置波形。直到遇到一个包含200多个信号的项目,反复点击鼠标的操作让我彻底崩溃。这时才发现,TCL脚本才是FPGA工程师的救星。 TCL&…...
C#上位机开发工业机器人:从零搭建第一个机器人控制程序
作为一名在工控行业摸爬滚打了十年的老工程师,我见过太多自动化工程师卡在"机器人上位机开发"这一关。很多人C#基础不错,也懂机器人原理,但就是不知道怎么把两者结合起来,写出一个能在生产环境运行的控制程序。 今天这篇文章,我会带着你从零开始,搭建一个完整…...
AUTO TECH China 2026广州汽车零部件展:从整机集成迈向核心部件的产业跃升
AUTO TECH China 2026广州汽车零部件展:从整机集成迈向核心部件的产业跃升当新能源汽车渗透率突破50%大关、汽车产业正经历百年未有的结构性变革之际,整车的差异化竞争优势正悄然从系统集成向功能模块与核心单元下沉。从一体化压铸车身结构件、高精度齿轮…...
破解人类微生物组数据分析难题:curatedMetagenomicData的完整解决方案
破解人类微生物组数据分析难题:curatedMetagenomicData的完整解决方案 【免费下载链接】curatedMetagenomicData Curated Metagenomic Data of the Human Microbiome 项目地址: https://gitcode.com/gh_mirrors/cu/curatedMetagenomicData 宏基因组数据分析在…...
毕设救星:手把手教你用Android Studio和OkHttp3搞定OneNET新版API数据获取(附完整Java代码)
物联网毕设实战:Android Studio对接OneNET新版API全流程解析 在物联网相关专业的毕业设计中,如何快速构建一个能实际运行的设备数据监控APP往往是让本科生头疼的难题。本文将手把手带你完成从零开始的完整开发流程,重点解决三个核心痛点&…...
Perplexity症状查询功能突然失效?排查清单来了:从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析
更多请点击: https://codechina.net 第一章:Perplexity症状查询功能突然失效?排查清单来了:从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析 当Perplexity的症状查询接口返回 401 Unauthorized 或…...
自主Agent的下一代智能系统
如果说上一代AI是“单打独斗”的数字大脑,那么自主Agent(智能体)的下一代——“人机环境系统智能”,就是“人机共生”的实体生态。它标志着AI正在从虚拟的比特世界,跨越到与人类、物理环境深度融合的现实世界。我们可以…...
JoyCon-Driver:Windows平台上的Switch手柄完美解决方案
JoyCon-Driver:Windows平台上的Switch手柄完美解决方案 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 还在为Nintendo Switch JoyCon控制器…...
VScode搭建一体化ROS开发环境:从配置到调试的完整实践指南
1. 项目概述与核心价值最近在带几个新同事上手机器人项目,发现他们配置ROS开发环境时,总会在各种依赖、路径和编译问题上卡壳,一折腾就是大半天。这让我想起自己刚接触ROS那会儿,也是被环境配置搞得焦头烂额,明明照着官…...
