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 后,使用音量摇杆手动设置最大音量时没有声音。

我用静态值 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);

因此,尽管我不存在声誉,但如果有人能回答我,我将不胜感激!

干杯!

4

2 回答 2

2

另一种选择是使用 MediaPlayer 播放音频。音量在 0.0(静音)和 1.0(最大)之间浮动。Android 习惯于所有你设置大容量,但这是一个错误。使用 MediaPlayer.setVolume(1.0f, 1.0f)。

http://developer.android.com/reference/android/media/MediaPlayer.html#setVolume(float , float)

通过使用 AudioManager,您可以调整手机的音量,就好像您真的将手指放在开关上并向上敲击一样。所以是的,这就是为什么即使在杀死应用程序之后它仍然存在的原因。您可能会考虑告诉用户确保将他们的音量调到最大,而不是为他们这样做。您可以使用 AudioManager 来询问它的级别,然后通知用户您需要最大音量。然后他们可以打开它。或者您可以保存他的设置并在您的应用程序安静等后恢复它。

于 2012-07-20T14:45:56.810 回答
0

AudioTrack 类有一个 setStereoVolume(left, right) 调用,它的运行完全独立于系统的音量设置。似乎是在特定轨道本身上设置的。

Seeing how you instantiate with Mono rather than Stereo sound in your track, I don't know if you'd end up with the desired results.

于 2013-05-29T14:20:40.893 回答