安卓手机音量最大时无声

3

这是我在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);

因为我没有信誉度,所以我非常感谢任何人能回答我的问题!

谢谢!

2个回答

2
另一种选择是使用MediaPlayer来播放音频。音量是介于0.0(静音)和1.0(最大)之间的浮点数。Android曾经允许您设置很大的音量,但那是一个错误。请使用MediaPlayer.setVolume(1.0f,1.0f)。
通过使用AudioManager,您可以像实际上将手指放在开关上并将其向上移动一样调整手机的音量。因此,即使在杀死应用程序后,它仍然是持久的。您可以考虑告诉用户确保将音量调到最大,而不是为他们做这件事。您可以使用AudioManager来查询其级别,然后通知用户您需要最大音量。然后他们可以把它调高。或者您可以保存他的设置,并在您的应用程序变得安静等之后恢复它。

好吧,我会继续读取当前音量级别并建议在必要时提高音量。虽然我很难接受我的实现没有错误,而是AudioTrack出现了故障。不管怎样还是谢谢! - Cdr. Powell

0

AudioTrack类有一个setStereoVolume(left, right)方法,它完全独立于系统的音量设置。看起来这是在特定的音轨上设置的。

考虑到您使用单声道而不是立体声音轨进行实例化,我不知道您是否会得到所需的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接