【问题标题】:Android: how to play music at maximum possible volume?Android:如何以最大音量播放音乐?
【发布时间】:2012-03-07 09:59:00
【问题描述】:

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

我目前正在使用 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); 
}

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

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

【问题讨论】:

    标签: android audio volume


    【解决方案1】:

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

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

    完成后,只需将其设置回原始音量即可。

    我想我被打败了,嗯嗯 :)

    一些实际执行此操作的代码,我使用的是 MediaPlayer 而不是音池,因为这会为您提供一个播放完成回调,而该回调似乎不会出现在音池上:

    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。

    【讨论】:

    • 是的,你是... ;-) 但我喜欢恢复原始音量的想法,所以当应用程序关闭(或终止)时,用户会重新设置她的音量...
    • 刚刚编辑好了,我觉得你真的不需要改变音量,你只需要在播放时使用最大音量而不是降低音量。
    • 我只是尝试了这个解决方案,但我确认由 SoundPool 类的 getStreamMaxVolume() 返回的值反映了用户设置的 Settins/Audio/Multimedia 音量级别。例如,在我的设备(姜饼)上,该设置的低值会导致返回值 15,并且播放的声音非常低......
    • 你说的很对,我误解了文档,左右流的 0 到 1 之间的音量是相对于当前最大音量的。这意味着您的原始代码不太正确,因为您应该在 streamVolume 变量中使用 1 。我刚刚编辑了(再次 - 不确定我是否应该将其粘贴在新答案中,但无论如何)提供我用来实现相同目标的代码的问题。
    • 如果此代码不起作用,请不要忘记 MODIFY_AUDIO_SETTINGS 权限:
    【解决方案2】:

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

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

    【讨论】:

    • AudioManager.getStreamMaxVolume() 是否独立于任何用户的设置?是设备的最大物理体积吗?
    • 它实际上改变了用户设置,所以是的。
    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多