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

时间:2012-11-27 22:11:28

标签: android audio microphone

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

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

由于

编辑

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

更新

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

更新

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

4 个答案:

答案 0 :(得分:3)

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

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

所有人都听起来像希思罗宾逊。您可以购买一个内置3针母插孔插座和一个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 还有一把锋利的刀和一些粘性物质。

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

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

答案 1 :(得分:2)

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

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

永远不知道...

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

我终于设法读取了踏板输入。 @ 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;
}