我在 SO 上的第一篇文章,所以我们开始吧:我正在开发一个通过音频插孔与附件通信的应用程序。为了可靠,信号量必须最大化。我使用媒体频道AudioTrack
进行播放。要设置音量,我使用以下代码,在几个地方推荐,包括 SO:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_SHOW_UI);
对我来说相当令人惊讶的结果:根本没有声音。但是,如果我愿意,在本节执行后,手动降低手机的音量(在 S+、S2、S3 和 Nexus 上测试并确认)它会突然调到最大音量。不是在滑块上,而是在实际音量上。应用程序的每次重复执行都会变得更糟。在执行一切正常之前,0 是无声的,15 是响亮的。
第一次运行:15 静音,14 最大。
第二次运行:15 是静音,14 是一半,13 是最大。
...
更糟糕的是:这种行为是系统持久的。杀死应用程序并收听 mp3 后,使用音量摇杆手动设置最大音量时没有声音。
我用静态值 14 替换了getStreamMaxVolume
(似乎总是返回 15,有几个地方指出音量范围是 0-15,我还没有找到证据),至少启动后现在有声音,但我的客户赢了我担心,如果我的应用程序改变了他的音量滑块行为,我不会太高兴。
我听说过/读过另一种可以改变相对于用户设置的音量的方法,所以如果他以 50% 的音量运行手机,该方法会将音量控制在 0-50% 之间,但我需要绝对最大音量.
哦,为了完整记录 AudioTracks 初始阶段:
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate /* 44100 */, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, 5000, AudioTrack.MODE_STREAM);
并且播放(mBAWholePeriod
是一个字节数组):
mAudioTrack.write(mBAWholePeriod, 0, mBAWholePeriod.length);
因此,尽管我不存在声誉,但如果有人能回答我,我将不胜感激!
干杯!