是否可以在android中连续检测外部声音?

时间:2013-11-15 12:08:08

标签: android audio service alarm

在我的一个应用程序中,我必须检测外部声音,即使应用程序在后台。我有一个问题。

即使app处于后台模式或关闭,是否可以连续检测外部声音?如果是这样,它会影响设备电池吗?

如果不可能,那么有没有其他方法可以实现这个目标?

请告诉我这件事。

谢谢,

2 个答案:

答案 0 :(得分:1)

我目前正在做类似这样的事情,我使用了一个扩展服务http://developer.android.com/guide/components/services.html的类。

如上所述,如果它连续运行,你可能会得到android ANR kill wait选项。我有两种解决方法。

  1. 确保您的服务没有在主ui线程上运行,使用Async或只是自己进行线程化。除此之外,尽量避免使用ANR。

  2. 我限制了每项服务的持续时间。即,服务侦听几秒钟,运行分析,保存它,如果满足条件,则在调用stopSelf()之前创建一个新服务。这可能有点hacky,但它也可以工作取决于你实际使用音频。

答案 1 :(得分:0)

编辑:我可能误解了你

这是我用来查看audiofocus是否与服务中的MediaPlayer一起更改的片段。你不会知道正在播放什么,但你会知道外部的东西是否正在请求音频:

    OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        //Manage audiofocus changes

        if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
                && mp != null) {
            if (mp.isPlaying())
                pausePlaying();
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN
                && mp != null) {
            if (!mp.isPlaying())
                pausePlaying();
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS
                && mp != null) {
            am.abandonAudioFocus(afChangeListener);

            if (mp.isPlaying())
                pausePlaying();
            Log.d("FOCUS", "Focus Changed AUDIOLOSS ");
        }
    }
};