Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

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)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值