Android:如何以最大可能音量播放音乐?

时间:2012-03-07 09:59:01

标签: android audio volume

我知道这个问题可以被视为“政治上不正确”,但我正在设计一款“按设计”必须引起人们在最大可能距离范围内注意的应用程序,否则将无法使用... : - )

我目前正在使用SoundManager类,这是播放我的ogg剪辑的代码:

public void playSound(int index) { 
     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 0, 0, 1.0f); 
}

问题是我播放剪辑的音量似乎取决于用户设置的“设置/音频/ Voulme”设置。相反,它似乎与硬件音量按钮设置无关。

Android应用是否有办法播放设备允许的最大物理音量?

5 个答案:

答案 0 :(得分:41)

我建议使用getStreamMaxVolume和setStreamVolume来执行此操作:

int origionalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);

然后,一旦完成,只需将其设置回原始音量。

我觉得我被打得很好,啊啊!)

实际执行此操作的一些代码,我使用的是MediaPlayer而不是soundpool,因为这会给你一个播放完整的回调,而这个回调似乎没有出现在soundpool上:

final AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
final int originalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDataSource("content://media/internal/audio/media/97");
mp.prepare();
mp.start();
mp.setOnCompletionListener(new OnCompletionListener()
{
   @Override
   public void onCompletion(MediaPlayer mp)
   {
      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0);
   }
});

通过调用mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 0, 0, 1.0f);,streamVolume值实际上是浮点数0 - > 1代表最大值的百分比,所以你真的只想把1.0f放在那里。

答案 1 :(得分:5)

您可以在播放音频之前调整设置。

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.getStreamMaxVolume(), 0);

答案 2 :(得分:1)

    float count=100*.01f;

MediaPlayer mp=new MediaPlayer();

 mp.setLooping(false);     
           mp = MediaPlayer.create(ActivityName.this, myUri);

          mp.setVolume(count,count);  
           mp.start(); 
 mp.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                                 mp.release(); 
                 mp.stop(); 
            }
        });

答案 3 :(得分:1)

这两个代码对我有用,但我更喜欢MediaPlayer中的代码

AudioManager  audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp=new MediaPlayer();
mp.setLooping(false);
mp = MediaPlayer.create(HomeActivity.this, notification);
mp.setVolume(count,count);
mp.start();
});

答案 4 :(得分:-1)

这是错误的代码。

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
                             audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);