如何通过音频插孔检测输入数据?

我知道一些设备耳机端口(可能全部?这里的任何参考都很好)有3个声道,用于立体声和麦克风。 所以我想知道是否有可能在这些设备上检测到这样的踏板 。

如果可能,使用录音机就足够了吗? 我正在研究应用程序的可能性,如果可能的话,这听起来很有希望。

谢谢

编辑

我正在寻找更多关于它的信息,我想知道踏板是否会与带按钮的耳机具有相同的效果。 覆盖它们的效果是致命的,我创建了一个简单的应用程序来完成它,现在我正在等待我的踏板尝试。 有什么想法吗?

UPDATE

我只是在踏板上尝试过它并没有用。 虽然我们设法使用踏板暂停音乐应用程序。 该设备正在运行Cyanogen。 录音机也没有检测到按键上的任何内容。 需要有关如何检测它的建议:)。

UPDATE

随着赏金即将到期,一个小小的更新。 @ Nick.T提供的最后一个链接得到了一些有用的信息,但我仍然无法创建一个样本来检测踏板。 因此,我对标题问题进行了一些小改动,对此方向的任何指导都将非常感谢!

目前尚不清楚这是否可以在我手中没有实际硬件的情况下工作,但是……不要将千斤顶完全插入sockets。 然后,插孔的尖端应该连接到此图的引脚2,左侧音频输出: http : //pinoutsguide.com/CellularPhones-PW/samsung_galaxy_headset_pinout.shtml并且环应该连接到引脚3,麦克风输入。如果您按千斤顶一直进入,插孔上的接地引脚短接麦克风输入,你将无法检测到任何东西 – 图片来自https://en.wikipedia.org/wiki/File:Photo-audiojacks.jpg显示如何连接会交配。

从左声道播放一些音频,将其录制在麦克风通道上,并测量振幅。 这可能 – 如果它全部正确连接 – 告诉你踏板的位置。 如果电位计的远端连接到千斤顶的环,那就无法工作了。

这一切听起来都是希思罗宾逊。 您可以购买一个内联3针母插孔sockets和一个4针公插头插头,并将两者连接在一起,以获得您需要的任何引脚。 没电子产品; 只是连接器和电线! 或使用类似这样的电缆: http : //www.ebay.co.uk/itm/1mt-3-5mm-4-Pin-Jack-Male-Plug-4-Pole-Jack-female-Socket-Extension- Lead-Cable- / 251172651017?pt = UK_Computing_Sound_Vision_Audio_Cables_Adapters&hash = item3a7b0e8009&_uhb = 1和一把锋利的刀和一些stickytape。

如果当插孔未完全插入家中时,手机拒绝向插孔发送音频,则会出现另一个问题 – sockets中有一个额外的触点,可以机械地检测到。 但如果您制作3针到4针适配器,它会起作用。

或者,只需从你的(shiny的新)表情踏板上切下3.5毫米的千斤顶。 将4针连接器更换为您躺在其周围的一个断电话耳机。

根据你的上一次更新,看起来踏板的反应就像免提耳机上的按钮一样。 也就是说,播放,暂停和跳过音乐或接听/挂断电话。 如果API的基础知识没有给你一个方法来掌握它(我怀疑),那么你可以向下移动到NDK,看看它是否可以被本机级别捕获。

我查了一下,认为这可能会帮助你find自己的方式:

  • 音频硬件

永远不知道……

这里有两种可能的可能途径。

  • 一种是使用耳机(或可能更具体地说是麦克风)存在检测电路,并通过适当的API读取该状态。 这将非常简单(只需要弄清楚正在测量真正耳机的属性)。 但是,响应可能相当慢,因为手机可能会经历一些音频配置更改,并且在“确定”耳机已连接或断开连接之前不希望这样做。 此外,最简单的非麦克风耳机检测可以通过插孔中的机械机构来检测,这可能难以跨模型电动致动。

  • 更复杂的想法是将一些声音耦合到麦克风输入中,并在软件中检测到它。 但是,它必须是振荡信号,因为麦克风带宽通常不会降至DC。 如果你只是施加一个稳定的电压,当它发生变化时你会得到一个“咔哒”的瞬态,但不是。 注入音频信号需要电源 – 经过精心设计,您可以从麦克风偏置电源中窃取足够的功率来运行小型振荡器。 但也许更简单的是让软件在扬声器上输出音频,并让你的踏板开关通过一个小电容器将其耦合回麦克风。

我终于设法读取了踏板输入。 @ emrys57是对的,用4针连接器替换插孔,用挂钩按钮做同样方式的麦克风触发输入。 但偶尔它似乎也会触发音量增大和音量调低键。 我想这与我用刀和胶带更换4针插孔有关。

覆盖onKeyUp非常简单。 请注意,您还必须重写onKeyDown以防止默认行为:

@Override public boolean onKeyDown(int keyCode,KeyEvent event){ int action = event.getAction(); if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { if (action == KeyEvent.ACTION_UP) { Log.d(TAG, "action_up"); clickStart(null); return true; } else if (action == KeyEvent.ACTION_DOWN) { Log.d(TAG, "action_down"); return true; } else { Log.d(TAG, "action:" + action); return true; } } return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { int action = event.getAction(); Log.d(TAG, "onKeyDown!"); if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { if (action == KeyEvent.ACTION_UP) { Log.d(TAG, "action_up"); clickStart(null); return true; } else if (action == KeyEvent.ACTION_DOWN) { Log.d(TAG, "action_down"); return false; } else { Log.d(TAG, "action:" + action); return true; } } if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); return true; } Log.d(TAG, "returning false"); return false; }