关于camera拍照音的一点研究

    大家可能使用过各种各样的手机,在使用中可能会发现某些手机的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();
              }
         }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值