我正在使用这个
camera.takePicture(null, rawCallback, jpegCallback);
但是对于某些设备,它会在相机捕获图像时发出声音。
请任何人帮忙,我怎样才能使相机快门声音静音?
我正在使用这个
camera.takePicture(null, rawCallback, jpegCallback);
但是对于某些设备,它会在相机捕获图像时发出声音。
请任何人帮忙,我怎样才能使相机快门声音静音?
您可以从 4.2 开始以编程方式将其关闭:
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(id, info);
if (info.canDisableShutterSound) {
mCamera.enableShutterSound(false);
}
要静音,请在捕获图像之前输入此代码
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);
camera.takePicture(null, rawCallback, jpegCallback);
1秒后,它将通过输入以下代码取消静音:
final Handler handler = new Handler();
Timer t = new Timer();
t.schedule(new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false);
}
});
}
}, 1000);
在单击按钮之前使用下面两行
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);
在图像被捕获后,这两个孤独的人:
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false);
我只知道这个解决方案,我个人在我的应用程序中使用它
正如 harism 所提到的,这在某些设备上是不可能的,因为某些市场(例如日本)有法律要求,即拍照总是会产生可听见的快门声。
用于这些类型声音的流类型是STREAM_SYSTEM_ENFORCED
,并且有一个只读系统属性确定您是否可以使此类流静音。
好吧,所有这些解决方案都很好,但我更喜欢在之前将音量设置为 0(不仅是系统,因为某些设备使用其他流然后是系统和/或并非所有流都包括系统):
像这样的东西可以完美地工作:
Camera mCamera = null;
function takePicture() {
storeSoundSettings();
setMuteAll(true);
// init camera and such.
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(IdOfCameraBackOrFront, info);
if (info.canDisableShutterSound) {
camera.enableShutterSound(false);
}
setMuteAll(false);
recoverSoundSettings();
}
并存储、恢复和设置静音,如下所示:
int[] streams = new int[]{
AudioManager.STREAM_ALARM,
AudioManager.STREAM_DTMF,
AudioManager.STREAM_MUSIC,
AudioManager.STREAM_NOTIFICATION,
AudioManager.STREAM_RING,
AudioManager.STREAM_SYSTEM,
AudioManager.STREAM_VOICE_CALL};
JSONObject json;
AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
public void storeSoundSettings() {
json = new JSONObject();
json.put("mode", manager.getMode());
json.put("ringermode", manager.getRingerMode());
for (int stream : streams) {
json.put("stream_" + stream, manager.getStreamVolume(stream));
}
}
public void recoverSoundSettings() {
json = new JSONObject(readString("last_audio_setting", null));
manager.setMode(json.getInt("mode"));
manager.setRingerMode(json.getInt("ringermode"));
for (int stream : streams) {
manager.setStreamVolume(stream, json.getInt("stream_" + stream), AudioManager.FLAG_ALLOW_RINGER_MODES);
}
public void setMuteAll(boolean mute) {
for (int stream : streams) {
manager.setStreamMute(stream, mute);
if (mute) {
manager.setStreamVolume(stream, 100, AudioManager.FLAG_ALLOW_RINGER_MODES);
} else {
manager.setStreamVolume(stream, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
}
}
不要忘记捕获异常。我删除了它们以更好地突出显示。