android静音相机快门声?

时间:2013-01-23 09:55:19

标签: android android-camera

我正在使用此

camera.takePicture(null, rawCallback, jpegCallback);

但是有些设备会在相机拍摄图像时发出声音。

请任何人帮忙,我怎样才能将相机快门声静音?

5 个答案:

答案 0 :(得分:9)

要静音,请在捕获图像前放置此代码

 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); 

答案 1 :(得分:9)

您可以使用以下命令从4.2开始以编程方式将其关闭:

Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(id, info);
if (info.canDisableShutterSound) {
    mCamera.enableShutterSound(false);
}

答案 2 :(得分:6)

在点击按钮

之前使用以下两行
 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);

我只知道这个解决方案,我个人在我的应用程序中使用它

答案 3 :(得分:1)

正如所提到的那样,在某些设备上无法做到这一点,因为某些市场(例如日本)有法律要求,拍照总是会产生可听见的快门声。

用于这些类型声音的流类型是STREAM_SYSTEM_ENFORCED,并且有一个只读系统属性,用于确定是否可以将此类流静音。

答案 4 :(得分:0)

嗯,所有这些解决方案都很好,但我更喜欢将卷设置为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();
}

并存储,恢复和setMuteAll像这样:

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);
        }
    }
}

不要忘记捕捉异常。我删除了它们以便更好地突出显示。