禁用相机快门声音,AudioManager 在三星中不起作用

Disable Camera Shutter Sound, AudioManager not working in Samsung

我像这样禁用了相机快门声:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
     mgr.setStreamVolume(AudioManager.STREAM_SYSTEM,0,0);
     mgr.adjustStreamVolume(AudioManager.STREAM_SYSTEM,AudioManager.ADJUST_MUTE, 0);
 } else {
     mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);
}

这对我的大多数测试设备都很有效。

如果我的系统声音选项是大声的,我可以在我的应用程序设置中禁用和启用快门声音。

我也在三星A3(2016)和三星S7上测试过,快门声音一直开到最大。当我在应用程序之外的系统设置中完全静音所有声音时 - 快门声音仍然存在。 此外,如果我在应用程序内部使用上面的代码片段禁用快门声,则在三星设备上会播放快门声。

我试图将所有标志设为静音:

int streams = AudioManager.STREAM_ALARM|
              AudioManager.STREAM_DTMF|
              AudioManager.STREAM_MUSIC|     
              AudioManager.STREAM_NOTIFICATION|
              AudioManager.STREAM_RING|
              AudioManager.STREAM_SYSTEM|
              AudioManager.STREAM_VOICE_CALL; 

mgr.adjustVolume(AudioManager.ADJUST_MUTE, streams);

还是一样的结果。

谁能告诉我,我在这里缺少什么?三星是否使用某种不同的 Audiostream?


编辑 1: 我添加了以下代码以检查上面的代码片段是否正在更改任何内容:

int streamMuted = mgr.getStreamVolume(AudioManager.STREAM_SYSTEM);

mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);

Boolean volumeFixed = mgr.isVolumeFixed();
streamMuted = mgr.getStreamVolume(AudioManager.STREAM_SYSTEM);

此处的输出是 STREAM_SYSTEM 开头的 StreamVolume 为“6”,然后我将此 Stream 静音。之后,我检查设备是否实施固定音量策略,即 'false'。 再次检查 StreamVolume 后,它的值为“0”。

难道快门声音是完全不同的AudioStream,即使我使用默认系统相机,也可以通过系统声音设置静音来禁用快门声音?

快门声音可能 hardware/manufacturer 依赖。在某些 Android versions/ROM 中无法禁用快门声音。您可以尝试在拍照前开启 "DoNotDisturb" 模式,但不保证效果很好。

更新

在拍照之前可以尝试其他三种解决方案:

  • 关闭隐藏的 "AudioManager.STREAM_SYSTEM_ENFORCED" streamType(使用反射)
  • 设置"AudioManager.setSpeakerphoneOn(false)"
  • 使用隐藏的 "android.media.AudioSystem.setDeviceConnectionState()" 暂时禁用扬声器(注意此过程将关闭所有 ANDROID 系统的扬声器,因此如果管理不善然后无法很好地恢复到它是非常危险的完成时的先前值)

put this into your manifest

  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />