11

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

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

谢谢

编辑

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

更新

我刚刚在踏板上试过了,它不起作用。尽管我们设法使用踏板来暂停音乐应用程序。不过,该设备正在运行 Cyanogen。录音机也没有检测到按键上的任何内容。需要有关如何检测它的建议:)。

更新

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

4

4 回答 4

3

目前尚不清楚这是否会在我手中没有实际硬件的情况下工作,但是......不要将插孔一直插入插座。然后,插孔的尖端应连接到此图的引脚 2,左侧音频输出:http: //pinoutsguide.com/CellularPhones-PW/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-铅电缆-/251172651017?pt=UK_Computing_Sound_Vision_Audio_Cables_Adapters&hash=item3a7b0e8009&_uhb=1 和一把锋利的刀和一些胶带。

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

或者,只需将 3.5 毫米插孔从您的(闪亮的新)表情踏板上剪下来。将其替换为您躺在身边的其中一个损坏的电话耳机上的 4 针连接器。

于 2012-12-06T19:58:16.050 回答
2

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

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

永远不知道...

于 2012-12-04T15:10:05.327 回答
1

这里有两条潜在的可能性路径。

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

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

于 2012-11-27T22:19:07.730 回答
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;
}
于 2013-03-06T15:53:51.413 回答