Я хотел бы воспроизвести собственный звуковой клип затвора камеры на захвате предварительного просмотра камеры. Я имею в виду звуковой клип, который воспроизводится при вызове takePicture()
.
Как мне это? Может ли кто-нибудь пройти меня через шаги?
Как воспроизвести звук родной камеры на Android
Ответ 1
Этот ресурс объясняет, как воспроизводить аудиофайлы: https://developer.android.com/guide/topics/media/index.html
Вероятно, вам придется предоставить свой собственный звуковой эффект затвора.
Ответ 2
Вы можете использовать класс MediaActionSound (доступный по API 16). Например:
MediaActionSound sound = new MediaActionSound();
sound.play(MediaActionSound.SHUTTER_CLICK);
Ответ 3
Если системный файл существует, вы можете использовать его следующим образом:
public void shootSound()
{
AudioManager meng = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
int volume = meng.getStreamVolume( AudioManager.STREAM_NOTIFICATION);
if (volume != 0)
{
if (_shootMP == null)
_shootMP = MediaPlayer.create(getContext(), Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));
if (_shootMP != null)
_shootMP.start();
}
}
Ответ 4
Возможно, вы захотите использовать SoundPool
SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
int shutterSound = soundPool.load(this, R.raw.camera_click, 0);
а затем воспроизвести звук
soundPool.play(shutterSound, 1f, 1f, 0, 0, 1);
Ознакомьтесь с http://developer.android.com/reference/android/media/SoundPool.html, чтобы понять параметры.
Вам понадобится медиафайл с именем camera_click.ogg в вашем проекте при res/raw. Вы можете использовать звук Android по умолчанию, который можно получить в проекте с открытым исходным кодом Android в следующем местоположении (frameworks/base/data/sounds/effects/camera_click.ogg), если ваш проект лицензирован в соответствии с лицензией Apache. Если ваш проект не лицензирован по лицензии Apache, я понятия не имею, можете ли вы его использовать или нет. Я не юрист.
Ответ 5
Этот фрагмент поможет вам воспроизводить звук только тогда, когда режим звонка находится в обычном режиме, а не в беззвучном режиме или вибрации.
private var audioManager: AudioManager? = null
private var mediaPlayer: MediaPlayer? = null
private fun initAudio() {
Log.v(LOG_TAG, "initAudio")
audioManager ?: let {
audioManager = context!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager?
}
mediaPlayer = try {
MediaPlayer().apply {
if (Build.VERSION.SDK_INT >= 21) {
val audioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
setAudioAttributes(audioAttributes)
} else {
setAudioStreamType(AudioManager.STREAM_MUSIC)
}
if (Build.VERSION.SDK_INT <= 28) {
setDataSource(context!!, Uri.parse("file:///system/media/audio/ui/camera_click.ogg"))
} else {
setDataSource(context!!, Uri.parse("file:///system/product/media/audio/ui/camera_click.ogg"))
}
prepare()
}
} catch (e: Exception) {
Log.e(LOG_TAG, "initAudio", e)
null
}
}
private fun playClickSound() {
if (audioManager?.ringerMode == AudioManager.RINGER_MODE_NORMAL) {
mediaPlayer?.start()
}
}