Android: как играть музыку на максимально возможном объеме?
Я знаю, что этот вопрос можно считать "политически неправильным", но я разрабатываю приложение, которое "по дизайну" должно привлекать внимание людей в максимально возможном диапазоне расстояний, иначе оно не будет использоваться...: -)
В настоящее время я использую класс 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 может воспроизводить звук с максимальным физическим уровнем, разрешенным устройством?
Ответы
Ответ 1
Я бы предложил использовать 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);
}
});
Btw с вызовом mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 0, 0, 1.0f);
значения streamVolume на самом деле являются float 0 → 1, которые представляют процент от максимального значения, поэтому вы действительно просто хотите разместить там 1.0f.
Ответ 2
Вы можете настроить параметры перед воспроизведением звука.
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.getStreamMaxVolume(), 0);
Ответ 3
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();
}
});
Ответ 4
Оба эти кода работали для меня, но я предпочитаю один из 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();
});
Ответ 5
Это неправильный код.
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);