【问题标题】:How to check whether microphone is used by any background app如何检查麦克风是否被任何后台应用程序使用
【发布时间】:2016-06-08 14:15:24
【问题描述】:

我已经搜索了几天,还没有找到合适的解决方案。

我正在尝试检查后台是否有任何应用程序正在使用麦克风,以便我的应用程序可以使用它,否则我只想显示消息“麦克风正在被另一个应用程序使用”。

我尝试在后台检查所有应用程序及其权限,但这并没有解决我的问题,因为有包 wearable.app 要求权限但它不影响音频,或者它没有使用它。

我尝试了可以​​在此处或在 google 上找到的其他解决方案,但似乎都不是正确的方法。

我只想检查麦克风是否未被使用,以便我的应用可以使用它。

任何建议我都会感激。

【问题讨论】:

    标签: android


    【解决方案1】:

    你可以反过来做。

    在您的应用中获取麦克风。

    获取已安装应用的列表,这些应用拥有 RECORD 权限。

    然后检查其中一个应用程序是否在前台,如果有一个应用程序释放麦克风以便另一个应用程序可以使用它(例如,当有电话呼叫时)。

    有点肮脏的做法,但我认为这就是你要找的。​​p>

    干杯!

    【讨论】:

    • 是的,但这仍然不能解决我的问题。假设有一个应用程序在我之前启动,它在后台录制音频。用户启动我的应用程序,我不能从该应用程序中取出麦克风,除非他们已经实现了广播接收器来释放麦克风(我认为很少这样做)。因此,当我的应用程序尝试启动麦克风时,它会卡住或崩溃,因为它不能使用麦克风,因为其他应用程序已经使用它来录制音频。
    • 但是没有这样的应用。如果一个应用程序使用了麦克风等硬件资源并且没有释放给其他应用程序使用它,那么手机甚至不会拨打电话。因此,除非您想让麦克风 24/7 全天候打开,否则您只需检查要捕获的时间(如果另一个应用程序正在使用它)。如果是,您将音频捕获推迟到可用时。
    • 但这就是问题所在,我试图在我的应用程序中获取麦克风,但它没有从其他应用程序释放,所以我的应用程序卡住或崩溃。我相信系统进程完全不同,它们总是可以从后台运行的任何应用程序中获取资源。因此,除非我遗漏了什么,否则您所说的“在您的应用程序中获取麦克风”是行不通的。我想要做的与 shazam 相同,当应用程序打开并且另一个应用程序在后台使用麦克风但未释放时,它会给出消息“麦克风正在使用”。我正在尝试做同样的事情
    • 我已经完成了a project,它对从麦克风捕获的声音进行了一些信号处理。 This is 我为此创建的服务。我使用了一个名为 TarsosDSP 的库来做到这一点。如果您足够勇敢,请深入研究。代码很乱,但其他应用程序没有任何问题。干杯!
    【解决方案2】:

    在搜索更多后,我找到了解决方案,我将其添加到此处,以便需要它的人更轻松地找到它。

    private boolean validateMicAvailability(){
        Boolean available = true;
        AudioRecord recorder =
                new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_DEFAULT, 44100);
        try{
            if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
                available = false;
    
            }
    
            recorder.startRecording();
            if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
                recorder.stop();
                available = false;
    
            }
            recorder.stop();
        } finally{
            recorder.release();
            recorder = null;
        }
    
        return available;
    }
    

    【讨论】:

    • 很好的解决方法,但我想知道是否也可以使用 OpenSLES 检测到。如果麦克风不可用,Atm 我的 OpenSLES 音频回调不会被触发。
    • 这不是正确的做法,recorder.getRecordingState() 只为您提供 AudioRecord 对象的状态。要知道麦克风是否在使用中,您必须使用 AudioManager。检查我的答案以了解查询麦克风可用性的正确方法。
    【解决方案3】:

    我知道这听起来可能有点乏味或冗长……但是您是否考虑过录制 logcat?记录内核和应用程序的日志。重新创建问题,然后比较两个日志以查看内核使用麦克风时占用的程序。

    【讨论】:

      【解决方案4】:

      这样就完成了

      AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
      
      if(am.getMode()==AudioManager.MODE_IN_COMMUNICATION){
         //Mic is in use
      }
      
      MODE_NORMAL -> You good to go. Mic not in use
      MODE_RINGTONE -> Incoming call. The phone is ringing
      MODE_IN_CALL -> A phone call is in progress
      MODE_IN_COMMUNICATION -> The Mic is being used by another application
      

      【讨论】:

        【解决方案5】:

        AudioManager.AudioRecordingCallback()

                am.registerAudioRecordingCallback(new AudioManager.AudioRecordingCallback() {
                @Override
                public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
                    super.onRecordingConfigChanged(configs);
                    try {
                        isMicOn = configs.get(0) != null;
                    }catch (Exception e)
                    {
                        isMicOn = false;
                    }
                    if (isMicOn) {
                        //microphone is on
                    } else {
                        // microphone is off
                    }
                    Toast.makeText(context, isMicOn ? "Mic on" : "Mic off", Toast.LENGTH_SHORT).show();
        
                }
            }, null);
        

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然您的回答可能会解决这个问题,但如果您能解释它如何以及为什么解决这个问题,将会很有帮助。另外,请记住,如果您提供高质量的答案,您将帮助任何未来的访问者回答这个问题,这反过来可能会导致投票。我鼓励您编辑您的答案,并添加关于它如何以及为什么解决这个问题的解释。
        猜你喜欢
        • 2022-06-14
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多