Android 8.1/9.0 MTK Camera源码分析之快门声音控制
在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口。之所以会有这个现象,主要原因是mtk camera仍旧使用的camera api1的接口。不同于camera api2,快门声音直接在上层控制,减少了很多麻烦。这一点在mtk 9.0的camera代码中就可以体现。
针对camera api1
快门声音控制
/frameworks/base/core/java/android/hardware/Camera.java中有定义控制快门声音的api。
ap中直接调用这个api来控制就可以快门声音,不过该api是camera api1,所以使用范围有限制。
public final boolean enableShutterSound(boolean enabled) {
if (!enabled) {
IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
IAudioService audioService = IAudioService.Stub.asInterface(b);
try {
if (audioService.isCameraSoundForced()) return false;
} catch (RemoteException e) {
Log.e(TAG, "Audio service is unavailable for queries");
}
}
return _enableShutterSound(enabled);
}
所以在ap层调用,直接使用parameter对象调用。
mCameraProxy.enableShutterSound(isShutterSoundOn); //控制拍照声音
api提供了enableShutterSound,也提供了disableShutterSound来直接关闭快门音:
public final boolean disableShutterSound() {
return _enableShutterSound(/*enabled*/false);
}
_enableShutterSound这个函数是调jni:
private native final boolean _enableShutterSound(boolean enabled);
在android_hardware_camera.cpp中定义:
static jboolean android_hardware_Camera_enableShutterSound(JNIEnv *env, jobject thiz,
jboolean enabled)
{
ALOGV("enableShutterSound");
//get_native_camera指向的是Camera.h/Camera.cpp
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return JNI_FALSE;
int32_t value = (enabled == JNI_TRUE) ? 1 : 0;
//往client端发送指令CAMERA_CMD_ENABLE_SHUTTER_SOUND
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;
}
}
指令CAMERA_CMD_ENABLE_SHUTTER_SOUND最终会被传递到CameraClient.cpp。
文件路径:frameworks/av/services/camera/libcameraservice/api1/CameraClient.cpp。
status_t CameraClient::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
LOG1("sendCommand (pid %d)", getCallingPid());
int orientation;
Mutex::Autolock lock(mLock)</