当前位置: 首页 > news >正文

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 带有投屏的功能&#xff0c;并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能&#xff0c;但是在测试中发现机顶盒关闭DLNA后&#xff0c;手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子&#xff0c…...

@Autowire、@Recourse用啥?

在使用IDEA写Spring相关的项目的时候&#xff0c;在字段上使用Autowired注解时&#xff0c;总是会有一个波浪线提示&#xff1a;Field injection is not recommended. 这是为啥呢&#xff1f;今天就来一探究竟。 众所周知&#xff0c;在Spring里面有三种可选的注入方式&#xf…...

[linux] 过滤警告⚠️

如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息&#xff0c;可以尝试以下方法&#xff1a; 使用warnings模块&#xff1a;导入warnings模块并设置warnings.filterwarnings("ignore")&#xff0c;这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...

Linux必备操作系统命令大全

一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数&#xff0c;只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数&#xff1a;目标目录名称。例如&#xff0c;若要进入 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比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1…...

Winform直接与Wpf交互

Winform项目中&#xff0c;可以直接使用wpf中的自定义控件和窗体 测试环境&#xff1a; vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下&#xff1a; 1 新建winfrom项目&#xff0c;名为WinFormDemo&#xff0c;默认有一个名为Form1的窗体…...

Uni-app 调用微信地图导航功能【有图】

前言 我们在使用uni-app时&#xff0c;有时候会遇到需要开发地图和导航的功能&#xff0c;这些方法其实微信小程序的API已经帮我们封装好了 详见&#xff1a;微信小程序开发文档 接下来我们就演示如何用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&#xff1f; append了的4个元素&…...

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…...

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫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&#xff0c;不成功&#xff0c;提示如下。 按网上说的&#xff1a;apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后&#xff0c;发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接&#xff0c;镜像地…...

AndroidUtil - 强大易用的安卓工具类库

官网 https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md 项目介绍 AndroidUtilCode &#x1f525; 是一个强大易用的安卓工具类库&#xff0c;它合理地封装了安卓开发中常用的函数&#xff0c;具有完善的 Demo 和单元测试&#xff0c;利用其封装好的 API…...

[多态设计模式]枚举

背景&#xff1a; 游戏服务器中&#xff0c;多态可以说体现的淋漓尽致。 如&#xff1a; 1.开启条件。有的系统是根据玩家等级&#xff0c;有的是根据通关第几关。 2.商店可能有不同类型的商店。 3.任务系统中&#xff0c;不同的计数类型&#xff0c;不同的任务目标类型。…...

【QT】QRadioButton的使用(17)

QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行&#xff0c;那么&#xff0c;今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xff1a;Download Pyt…...

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&am…...

【含java2023面试题】HashMap、HashTable、ConcurrentHashMap

作为Java中最常用的Map集合&#xff0c;HashMap、HashTable和ConcurrentHashMap都是线程安全的&#xff0c;但它们之间有什么区别呢&#xff1f;在本文中&#xff0c;我们将深入探讨这三种Map集合的区别&#xff0c;并通过Java代码示例来演示它们之间的差异。 AI绘画关于SD,MJ…...

AT24C02芯片

AT24C02简介&#xff1a; AT24C01/02/04/08/16...是一个 1K/2K/4K/8K/16K 位串行 CMOS内部有9个字节&#xff1b; 该器件通过 I2C 总线接口进行 操作&#xff0c;它有一个专门的写保护功能&#xff1b; 基于51 他有这个芯片操作 时序&#xff1a; AT24C02软件编程&#xff1a; …...

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango前后端分离》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...