大家可能使用过各种各样的手机,在使用中可能会发现某些手机的camera声音是没法关闭的;这是因为在有些国家法律规定,带拍照功能的手机设备上必须开启拍照音,这样是为了防止偷拍。但是如果我们想关闭手机拍照音或可以随系统的音量变化改怎么办呢?
通过做过的项目,会有两种需求:
1、camera音量不可变,但是当手机静音或震动时,拍照无声。
2、camera音量随着系统音量的大小而变化。
针对以上两种需求,在开发中我是通过如下修改来实现的。
1、更改init.rc中setprop ro.camera.sound.forced这个property值,将其置为0;这种修改主要是针对需求1的。
2、针对需求2,可以有两种改法:
1)修改frameworks\base\services\camera\libcameraservice\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 {
LOGE("Failed to load CameraService sounds: %s", file);
delete mp;
return NULL;
}
return mp;
}
将AUDIO_STREAM_ENFORCED_AUDIBLE改成AUDIO_STREAM_RING即可;这种是将camera的声音类型改了。
2)修改frameworks\base\services\camera\libcameraservice\CameraService.cpp中关于播放声音的地方,在我的代码中主要就是更改:
void CameraService::playSound(sound_kind kind) {
LOG1("playSound(%d)", kind);
Mutex::Autolock lock(mSoundLock);
sp<MediaPlayer> player = mSoundPlayer[kind];
if (player != 0) {
player->seekTo(0);
player->start();
}
}
在代码中添加获得系统音量的代码,并将音量设置一下,更改后代码如下:
void CameraService::playSound(sound_kind kind) {
LOG1("playSound(%d)", kind);
Mutex::Autolock lock(mSoundLock);
sp<MediaPlayer> player = mSoundPlayer[kind];
if (player != 0) {
int index;
AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_RING, &index);
AudioSystem::setStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, index);
player->seekTo(0);
player->start();
}
}