Android手机在最大输出音量时保持沉默

时间:2012-07-20 10:29:48

标签: java android volume

首先发布我的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);

所以,我真的很感激,如果我的名声不存在,有人会回答我吗?

干杯!

2 个答案:

答案 0 :(得分:2)

另一种选择是使用MediaPlayer播放音频。 Volume是0.0(静音)和1.0(最大)之间的浮点数。 Android使用所有你设置大卷,但这是一个错误。使用MediaPlayer.setVolume(1.0f,1.0f)。

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

通过使用AudioManager,您正在调整手机的音量,就像您将手指放在开关上并将其撞到一样。所以是的,这就是为什么它在杀死应用程序后仍然持久。您可以考虑告诉用户确保他们的音量达到最大值而不是为他们做。您可以使用AudioManager查询其所在的级别,然后通知用户您需要最大音量。然后他们可以把它打开。或者你可以保存他的设置,并在你的应用程序安静等后恢复它。

答案 1 :(得分:0)

AudioTrack类具有setStereoVolume(左,右)调用,该调用完全独立于系统的音量设置。它似乎是在特定轨道上设置的。

看到你如何使用Mono而不是立体声声音实例化,我不知道你是否最终得到了预期的结果。