diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 829620b460596..652356c02c37f 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -1145,6 +1145,31 @@ public class Camera { */ public native final void setDisplayOrientation(int degrees); + /** + * Enable or disable the default shutter sound when taking a picture. + * + * By default, the camera plays the system-defined camera shutter sound when + * {@link #takePicture} is called. Using this method, the shutter sound can + * be disabled. It is strongly recommended that an alternative shutter sound + * is played in the {@link ShutterCallback} when the system shutter sound is + * disabled. + * + * Note that devices may not always allow control of the camera shutter + * sound. If the shutter sound cannot be controlled, this method will return + * false. + * + * @param enabled whether the camera should play the system shutter sound + * when {@link #takePicture takePicture} is called. + * @return true if the shutter sound state was successfully changed. False + * if the shutter sound cannot be controlled; in this case, the + * application should not play its own shutter sound since the + * system shutter sound will play when a picture is taken. + * @see #takePicture + * @see ShutterCallback + * @hide + */ + public native final boolean enableShutterSound(boolean enabled); + /** * Callback interface for zoom changes during a smooth zoom operation. * diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 6cd8955d366ba..e1e97a19cf0fe 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -781,6 +781,25 @@ static void android_hardware_Camera_setDisplayOrientation(JNIEnv *env, jobject t } } +static jboolean android_hardware_Camera_enableShutterSound(JNIEnv *env, jobject thiz, + jboolean enabled) +{ + ALOGV("enableShutterSound"); + sp camera = get_native_camera(env, thiz, NULL); + if (camera == 0) return JNI_FALSE; + + int32_t value = (enabled == JNI_TRUE) ? 1 : 0; + status_t rc = camera->sendCommand(CAMERA_CMD_ENABLE_SHUTTER_SOUND, value, 0); + if (rc == NO_ERROR) { + return JNI_TRUE; + } else if (rc == PERMISSION_DENIED) { + return JNI_FALSE; + } else { + jniThrowRuntimeException(env, "enable shutter sound failed"); + return JNI_FALSE; + } +} + static void android_hardware_Camera_startFaceDetection(JNIEnv *env, jobject thiz, jint type) { @@ -890,6 +909,9 @@ static JNINativeMethod camMethods[] = { { "setDisplayOrientation", "(I)V", (void *)android_hardware_Camera_setDisplayOrientation }, + { "enableShutterSound", + "(Z)Z", + (void *)android_hardware_Camera_enableShutterSound }, { "_startFaceDetection", "(I)V", (void *)android_hardware_Camera_startFaceDetection },