Подтвердить что ты не робот

Звук затвора камеры для андроида?

Я использую этот

camera.takePicture(null, rawCallback, jpegCallback);

но с некоторыми устройствами он производит звук, когда камера захватывает изображение.

Пожалуйста, помогите, как я могу отключить звук затвора камеры?

4b9b3361

Ответ 1

Для Mute поместите этот код перед захватом изображения

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

Ответ 2

Вы можете отключить его программно с 4.2 с помощью:

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

Ответ 3

Используйте ниже двух строк перед нажатием кнопки

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

Я знаю только это решение, и я лично использовал его в своем приложении

Ответ 4

Как упоминалось в харизме, это невозможно сделать на некоторых устройствах, поскольку на некоторых рынках (например, в Японии) существуют законодательные требования, при которых изображение всегда приводит к слышимому звуку затвора.

Тип потока, используемый для этих типов звуков, STREAM_SYSTEM_ENFORCED, и существует системное свойство только для чтения, которое определяет, можно ли отключить такой поток.

Ответ 5

Ну, все эти решения хороши, но я предпочитаю устанавливать том на 0 (и не только на систему, так как некоторые устройства используют другие потоки, а затем системные и/или не все потоки включают систему):

smth, как это будет работать безупречно:

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

и сохраните, восстановите и установитеMuteAll примерно так:

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

Не забудьте воспользоваться исключениями. Я удалил их для лучшего выделения.