<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>按键 on 栈外随记</title>
    <link>https://btio.cn/tags/%E6%8C%89%E9%94%AE/</link>
    <description>Recent content in 按键 on 栈外随记</description>
    <image>
      <title>栈外随记</title>
      <url>https://btio.cn/images/logo-arong.svg</url>
      <link>https://btio.cn/images/logo-arong.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-CN</language><lastBuildDate>Fri, 07 Aug 2026 20:17:54 +0800</lastBuildDate>
    <atom:link href="https://btio.cn/tags/%E6%8C%89%E9%94%AE/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【中科蓝讯】TWS 按键问题单复盘</title>
      <link>https://btio.cn/posts/2026/08/07/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E6%8C%89%E9%94%AE%E9%97%AE%E9%A2%98%E5%8D%95%E5%A4%8D%E7%9B%98/</link>
      <pubDate>Fri, 07 Aug 2026 20:17:54 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/08/07/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E6%8C%89%E9%94%AE%E9%97%AE%E9%A2%98%E5%8D%95%E5%A4%8D%E7%9B%98/</guid>
      <description>&lt;h2 id=&#34;section-1&#34;&gt;一、写在开始&lt;/h2&gt;
&lt;p&gt;我参与的是一款基于中科蓝讯 BT8910 的 TWS 耳机品牌项目，目前这个项目已经完成。&lt;/p&gt;
&lt;p&gt;项目结束后，我想把开发过程中接触到的 Jira 问题单重新梳理一遍。其中既有我参与处理的内容，也有同事负责的模块。&lt;/p&gt;
&lt;p&gt;现在查一个函数、一个配置项并不难，真正值得记录的是：面对一个问题现象时，应该先判断哪一层，为什么往这个方向查，以及怎么通过日志一步步缩小范围。&lt;/p&gt;
&lt;p&gt;所以这次复盘不是给出一套标准答案，而是站在我目前对应用层的理解上，把问题现象、判断过程和排查思路整理下来，供遇到类似问题的同学参考。&lt;/p&gt;
&lt;p&gt;整理过程中我还发现，很多反馈看起来不一样，根因却有重复。按根因归类后，下次遇到类似现象时，就可以先判断问题属于哪个环节，再沿对应链路往下查。&lt;/p&gt;
&lt;p&gt;后续我会继续按模块整理项目中的问题单，包括按键、提示音、机盒通信、ANC、音量控制、功耗管理、出入盒、双耳同步、蓝牙问题和连接问题等内容。这一篇先从按键开始，归纳其中比较常见的 4 类问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读提示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;全文约 2 300 字，预计 10 分钟读完。&lt;/p&gt;
&lt;p&gt;本文包含 4 类按键问题：完全无响应、场景功能错误、误触，以及复杂手势互相干扰。重点不是讲基础原理，而是遇到类似反馈时，应该先查哪里、再往哪里查。&lt;/p&gt;
&lt;p&gt;本文只讨论按键链路本身。如果按键已经触发正确功能，只是提示音没有播放或播放不对，就归到后续的提示音问题中。&lt;/p&gt;
&lt;h2 id=&#34;section-2&#34;&gt;二、所有手势都没有反应&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;客户反馈&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其中一只耳机的触控按键完全无效，双击、三击、长按都没有反应。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查思路&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：确认触控输入&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先看这只耳机的触控按键是否有按下、松开的日志。&lt;/p&gt;
&lt;p&gt;没有日志：先查这个触控按键的输入本身，例如触控是否启用、耳机是否在盒内、是否正处于禁键时间、触控阈值或通道是否正常。&lt;/p&gt;
&lt;p&gt;有日志：说明这个触控按键已经有输入，继续往下查。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：确认手势识别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;再看目标手势有没有识别出来。&lt;/p&gt;
&lt;p&gt;没有识别出来：重点查双击间隔、长按时间、松手后状态是否复位，以及组合手势是否把普通手势挡住了。&lt;/p&gt;
&lt;p&gt;识别出来：说明手势已经产生，继续看功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：确认功能消息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后看手势有没有转换成正确的功能消息。&lt;/p&gt;
&lt;p&gt;没有、为空或错误：查按键定义、场景切换和配置更新。&lt;/p&gt;
&lt;p&gt;有正确消息：再确认功能处理是否执行；如果功能已经执行，后面只是没有提示音，就属于提示音问题，不再按按键问题处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断与处理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“完全无效”不一定是触控硬件问题，也可能是手势已经产生、但后面没有正确链接到功能。处理时不要一开始就调灵敏度或改功能定义，先通过日志确认问题停在哪一层。&lt;/p&gt;
&lt;h2 id=&#34;section-3&#34;&gt;三、同一手势，功能却错了&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;客户反馈&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;听歌时双击正常，来电时双击却不能接听或挂断。&lt;/li&gt;
&lt;li&gt;长按在听歌时能切换功能，到响铃或通话时却失效。&lt;/li&gt;
&lt;li&gt;App 改完触控后，耳机执行的功能不对。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;排查思路&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：固定一个场景复现&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只测听歌、只测来电响铃，或只测通话，避免混在一起判断。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：确认手势已经识别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果手势都没出来，回到第一类问题排查。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：核对当前场景的功能&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;手势正常后，直接看耳机最后想执行的是什么功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同样是“双击”：听歌时可能是切歌，来电时应该是接听或拒接，通话中又可能是其他操作。&lt;/li&gt;
&lt;li&gt;来电时双击却去切歌：说明双击识别没有问题，只是耳机还在按“听歌时的规则”处理。&lt;/li&gt;
&lt;li&gt;只有通话异常：重点检查进入通话后，双击和长按是否已经改成通话时该做的功能。&lt;/li&gt;
&lt;li&gt;App 改完才异常：重点检查新设置是否把听歌、来电或通话时的功能改错了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;判断与处理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;听歌、来电响铃、通话时都可以识别同一个“双击”或“长按”，但后续要执行的功能并不相同。&lt;/p&gt;
&lt;p&gt;这类问题通常是耳机没有按当前使用状态执行对应功能。处理重点是把每种状态下的功能对应关系确认清楚。&lt;/p&gt;
&lt;h2 id=&#34;section-4&#34;&gt;四、不该响应时仍然响应&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;客户反馈&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;耳机放在盒内还能切歌；刚出盒或拿取耳机时，容易误触切换功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查思路&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：确认误触发生的时机&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【中科蓝讯】TWS 耳机按键处理流程</title>
      <link>https://btio.cn/posts/2026/08/07/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E8%80%B3%E6%9C%BA%E6%8C%89%E9%94%AE%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/</link>
      <pubDate>Fri, 07 Aug 2026 18:39:14 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/08/07/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E8%80%B3%E6%9C%BA%E6%8C%89%E9%94%AE%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/</guid>
      <description>&lt;p&gt;上一篇已经把 SDK 的几个核心概念过了一遍，包括模式状态机、process/message/display 和消息分层。&lt;/p&gt;
&lt;p&gt;这一篇就拿按键功能做一次具体分析，从一个按键事件出发，一直追到最终执行的位置。&lt;/p&gt;
&lt;p&gt;以我接触到的 TWS 项目来看，按键是应用层里相对好理解、也比较容易上手的一部分：改单击功能、加长按、加多击，或者调整不同模式下的按键行为。这些需求在 SDK 里都对应到同一套机制，弄懂之后，定位修改位置会更快。&lt;/p&gt;
&lt;h2 id=&#34;section-1&#34;&gt;一、先跑一遍完整链路&lt;/h2&gt;
&lt;p&gt;一个按键从手指按下到功能执行，在 SDK 里走了这几步：&lt;/p&gt;
&lt;div class=&#34;mermaid-diagram&#34; role=&#34;group&#34; aria-label=&#34;流程图&#34;&gt;
  &lt;pre class=&#34;mermaid&#34;&gt;%%{init: {&amp;#34;flowchart&amp;#34;: {&amp;#34;htmlLabels&amp;#34;: true, &amp;#34;wrappingWidth&amp;#34;: 1000, &amp;#34;rankSpacing&amp;#34;: 30}, &amp;#34;themeVariables&amp;#34;: {&amp;#34;lineColor&amp;#34;: &amp;#34;#71829a&amp;#34;}}}%%
flowchart TB
    subgraph R0[&amp;#34;① 输入与识别&amp;#34;]
        direction LR
        R0N0[&amp;#34;手指按下&amp;lt;br/&amp;gt;用户触发按键&amp;#34;]
        R0N1[&amp;#34;硬件扫描&amp;lt;br/&amp;gt;读取按键编号&amp;#34;]
        R0N2[&amp;#34;消抖 / 识别&amp;lt;br/&amp;gt;判断短按、长按、多击&amp;#34;]
        R0N0 --&amp;gt; R0N1 --&amp;gt; R0N2
    end
    class R0N0,R0N1,R0N2 blue;
    style R0 fill:#f1f6fd,stroke:#b8cfe8,color:#23456b
    subgraph R1[&amp;#34;② 消息与业务&amp;#34;]
        direction LR
        R1N0[&amp;#34;查按键表&amp;lt;br/&amp;gt;找到对应消息&amp;#34;]
        R1N1[&amp;#34;消息入队&amp;lt;br/&amp;gt;放入消息队列&amp;#34;]
        R1N2[&amp;#34;模式分发&amp;lt;br/&amp;gt;按当前模式处理&amp;#34;]
        R1N3[&amp;#34;功能执行&amp;lt;br/&amp;gt;播放、切歌、接听等&amp;#34;]
        R1N0 --&amp;gt; R1N1 --&amp;gt; R1N2 --&amp;gt; R1N3
    end
    class R1N0,R1N1,R1N2,R1N3 green;
    style R1 fill:#f0f8f3,stroke:#b9d7c4,color:#24563a
    R0 --&amp;gt; R1
    classDef blue fill:#e8f2ff,stroke:#7ba4d8,color:#23456b,stroke-width:1.5px;
    classDef green fill:#e7f4ec,stroke:#78aa8b,color:#24563a,stroke-width:1.5px;
    classDef amber fill:#fff3df,stroke:#d5a25b,color:#72501e,stroke-width:1.5px;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;前两步主要回答“这个按键物理上发生了什么”。从第 3 步开始，软件才把按键行为转换成功能。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
