最近接到一客户需求,要为相机添加一个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--
看了好久好久,整个JNI的流程也没错啊,,,唉,项目紧的确木有办法了。。只有换一个办法了。。。我看了另外的几款4.1系统及一下的机器,貌似快门声音跟手机铃声大小是一致的哎....好吧
只有二次山寨化了!
还是在这个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里面已经有了快门声音开关的方法了,哎。。。谷歌大哥早点弄出来就不用我花那么多时间去慢慢跟踪了,不过也算是把这一段东西给熟悉了一下了....