【问题标题】:setMicrophoneMute(boolean) doesn't work on some devicessetMicrophoneMute(boolean) 在某些设备上不起作用
【发布时间】:2011-03-07 08:29:59
【问题描述】:

我在这里找不到任何相关的帖子(但互联网上的其他小帖子),所以这里是:

AudioManager.setMicrophoneMute(boolean) 在我测试过的某些特定设备上没有任何作用:Google Nexus S、三星 Galaxy S 和摩托罗拉 Milestone。 在任何其他设备上都可以正常工作。

它甚至保持其“状态”并返回一个布尔值,就好像它已静音\取消静音,但它不会静音 - 麦克风继续录制 - 在 GSM 通话和 AudioRecord 编程录制中。 没有指示性日志消息。

我还搞砸了权限(android.permission.MODIFY_AUDIO_SETTINGS、android.permission.RECORD_AUDIO),这里没有什么新鲜事。

有没有其他人遇到过这种情况?有没有人有解决方法或神奇的解决方案? 如果我使用 AudioRecord,我只是为这些设备实现我自己的“静音”——我不会传递记录的缓冲区。但它无法帮助我在 GSM 通话中将麦克风静音,这是我需要的。

谢谢

---------------- 更新 ----------------

见下文。

【问题讨论】:

  • 你有什么收获吗?

标签: android


【解决方案1】:

您好,我遇到了同样的问题,我想模拟来电屏幕。 并在该屏幕内执行静音按钮,并且 AudioManager.setMicrophoneMute(boolean) 在大多数手机上都有效,但并非在所有手机上都有效。我找到了绕过它的方法。我模拟按下免提套件上的静音按钮。它对我有用,希望它也能帮助你 这是代码:

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK));
getBaseContext().sendOrderedBroadcast(buttonUp,"android.permission.CALL_PRIVILEGED");

【讨论】:

    【解决方案2】:

    我遇到了这个问题,因为我想编辑包含 AAC 音频数据的 M4A 文件。我希望能够合并它们并添加静音作为填充。由于不同设备每帧的毫秒数不同,我决定将麦克风静音并录制一秒钟的静音,然后在需要填充静音时一遍又一遍地重复。 (M4A + AAC 静音比原始 PCM 复杂得多)。

    不幸的是,我在 Android 设备上遇到了许多静音差异。这是我学到的:

    • 除非您使用 MODIFY_AUDIO_SETTINGS 权限,否则静音将静默失败。没有错误消息,只是不会静音
    • 三星 Galaxy Tab 10.1 和摩托罗拉 Xoom 可以正常工作。调用 audioManager.setMicrophoneMute(true) 静音和 audioManager.setMicrophoneMute(false) 取消静音
    • HTC Inspire(使用 CyanogenMod 7)和 Motorola Droid X 将错误地返回 true 到 audioManager.isMicrophoneMute,但实际上不会静音。要解决此问题,请在静音之前调用 audioManager.setMode(AudioManager.MODE_IN_CALL)。完成静音后,请务必将模式更改回原来的模式 - 我不确定,但如果您将其设置为不正确的模式,其他应用中可能会出现问题。
    • HP 触摸板,被黑客入侵以双启动到 CyanogenMod 7,根本不喜欢静音。它会产生无用的录音文件,并且对 audioManager.setMode() 的调用需要五秒钟才能返回。
    • HTC MyTouch 4G 声称它已静音,但在我能找到的任何情况下都不会自行静音。
    • HTC Flyer 会静音,但只要您调用 mediaRecorder.start() 或 mediaRecorder.stop(),它就会自行取消静音。您可以再次静音,但可能会先听到几分之一秒的声音。
    • Gingerbread 设备,无论您是否愿意,在任何 MediaRecorder 录制开始时都会有半秒到一秒的静音。整个录音的长度是正确的,第一部分只是静音,而不是捕捉麦克风当时接收到的内容。

    在我的例子中,为了生成一个给定设备使用的具有适当的每帧毫秒数的静音文件(因此在与其他音频文件合并时它是兼容的),我使用类似于以下的代码:

    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int oldAudioMode = audioManager.getMode();
    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setMicrophoneMute(true);
    MediaRecorder mediaRecorder = new MediaRecorder();
    int bitRate = 1000 * 160;
    mediaRecorder.setAudioEncodingBitRate(bitRate);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(silenceFile.getAbsolutePath());
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setAudioSamplingRate(44100);
    try {
        mediaRecorder.prepare();
    } catch (IOException ioe) {
        throw new RuntimeException("could not prepare mediarecorder to create silence file",ioe);
    }
    mediaRecorder.start();
    audioManager.setMicrophoneMute(true); //re-mute for devices like HTC Flyer that unmute
    try {
        Thread.sleep(SILENCE_LENGTH_MILLIS);
    } catch (InterruptedException ie) {
        throw new RuntimeException("could not record silence file", ie);
    }
    mediaRecorder.stop();
    audioManager.setMicrophoneMute(false);
    audioManager.setMode(oldAudioMode);
    int currentVersion = android.os.Build.VERSION.SDK_INT;
    if (currentVersion <= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
        //cut out beginning half second and use that, since it's always silent on Gingerbread
    } else {
        //Honeycomb and up
        //Take end of audio and use that--if the device unmuted itself there may be a little noise at the beginning
    }
    

    这是一个完整的解决方案吗?不会。有些设备不会静音。如果您尝试静音,其他设备(例如前面提到的 HP 触摸板)会导致所有新问题。希望这些技巧至少可以帮助人们在大多数 Android 设备上静音。

    【讨论】:

      【解决方案3】:

      没有找到解决方案。如果录制的音频用作数据缓冲区,请使用静音 PCM 数据(用零填充)。如果您需要以编程方式将常规电话静音,请通知用户此设备需要从通话屏幕手动静音。

      我认为这是最终的答案,但请让我感到惊讶。

      【讨论】:

        【解决方案4】:

        你可以试试这个:

        AudioManager audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE));
            audioManager.setMode(AudioManager.MODE_NORMAL);
            if(state) //state-boolean 
            {
                audioManager.setMicrophoneMute(false);
                audioManager.setMode(AudioManager.MODE_IN_CALL);
                state= false;
            }
            else
            {
                audioManager.setMicrophoneMute(true);
                state = true;
            }
        

        【讨论】:

          猜你喜欢
          • 2015-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多