最近接到一客户需求,要为相机添加一个shutter

sound的controlbtn,刚看到的时候,觉得很简单吧,不就是在布局中添加好控件,然后响应close和open事件调用相应的方法就行了。想想是很简单的样子,可是后来才发现,在4.1以及以下的版本,这个快门声音都是在点击拍照按钮以后,回调函数里直接就playsound了。。。而在API里面也木有这个控制快门声音的方法。。。

而在frameworks\base\services\camera\libcameraservice\CameraService.cpp里面,却有这么一个方法 :

// enable shutter sound

status_t CameraService::Client::enableShutterSound(bool enable)

{

...

...

}

确定这个就是控制快门声音的,但是要想调用,那得写一个JNI唉。。。。捣鼓了一下午,添加好了,但是编译缺找不到这个native

method--

a4c26d1e5885305701be709a3d33442f.png看了好久好久,整个JNI的流程也没错啊,,,唉,项目紧的确木有办法了。。只有换一个办法了。。。我看了另外的几款4.1系统及一下的机器,貌似快门声音跟手机铃声大小是一致的哎....好吧

只有二次山寨化了!

a4c26d1e5885305701be709a3d33442f.png

还是在这个CameraService.cpp里面,有一个地方。。

MediaPlayer* CameraService::newMediaPlayer(const char *file)

{

MediaPlayer*

mp = new MediaPlayer();

if

(mp->setDataSource(file, NULL) == NO_ERROR) {

mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);//这里是控制快门声音输出流的类型

mp->prepare();

} else

{

ALOGE("Failed to load CameraService sounds: %s", file);

return NULL;

}

return

mp;

} 将AUDIO_STREAM_ENFORCED_AUDIBLE改为AUDIO_STREAM_RING,这样就把快门声音弄成手机铃声一个STREAM了,编译好了push进机器,reboot之后,发现快门声音是随着手机铃声的改变而改变的,离需求还是不够唉。。。但是已经很近了,反正是采用的山寨方法,在APP里面去判断呗。。。

setRingerMode(AudioManager.RINGER_MODE_SILENT)和setRingerMode(AudioManager.RINGER_MODE_NORMAL);

拍照的时候就静音,拍完了就恢复或者1S后恢复手机铃声就行了....

这样一来倒还是勉强满足需求了。。。。。

不过有好消息就是,在4.2和以后的版本中,API里面已经有了快门声音开关的方法了,哎。。。谷歌大哥早点弄出来就不用我花那么多时间去慢慢跟踪了,不过也算是把这一段东西给熟悉了一下了....

写了一堆废话,以后牛逼点了回来再看看 反省反省···

a4c26d1e5885305701be709a3d33442f.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐