这是我在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时没有声音。
我替换了getStreamMaxVolume
(似乎总是返回15,几个地方声明音量范围为0-15,但我没有找到证据)通过静态值14,并且至少在启动后现在有声音了,但我担心我的客户不会太高兴如果我的应用程序改变了他的音量滑块行为。
我听说/阅读过另一种可以相对于用户设置改变音量的方法,因此,如果他以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);
因为我没有信誉度,所以我非常感谢任何人能回答我的问题!
谢谢!