私はこれを使用しています
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);
ボタンをクリックする前に以下の 2 行を使用
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);
そして、画像がキャプチャされた直後のこれらの 2 つのローン:
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false);
私はこのソリューションしか知らず、アプリケーションで個人的に使用しました
ハリズムが述べたように、これは一部のデバイスでは実行できません。一部の市場 (たとえば日本) では、写真を撮ると常にシャッター音が聞こえるという法的要件があるためです。
これらのタイプのサウンドに使用されるストリーム タイプは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();
}
そして、次のように保存、回復、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);
}
}
}
例外をキャッチすることを忘れないでください。強調表示を改善するためにそれらを削除しました。