如何在android中静音MediaPlayer

Posted

技术标签:

【中文标题】如何在android中静音MediaPlayer【英文标题】:How to mute MediaPlayer in android 【发布时间】:2011-06-02 04:48:30 【问题描述】:

如何在 android 中静音 MediaPlayer

【问题讨论】:

【参考方案1】:

这段代码对我有用,

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
mp.start();

对于静音

mp.setVolume(0,0);

& 取消静音全音量

mp.setVolume(1,1);

【讨论】:

两位数分别代表左右声道,所以取消静音的应该是mp.setvolume(1,1); 我知道这是很久以后的事了,但是当我尝试设置音量时出现空指针异常。非常感谢您的帮助。 你应该先初始化,同时设置音量应该交叉检查不为空 这只会使一个音频文件静音。如果我有多个音频文件并且我想在任何活动中全局打开/关闭声音怎么办? 对于多个音频文件,您正在使用多个媒体播放器实例,因此您必须将所有实例静音。【参考方案2】:
 AudioManager   mAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);

    int current_volume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    //If you want to player is mute ,then set_volume variable is zero.Otherwise you may supply some value.
    int set_volume=0;
    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,set_volume, 0);

【讨论】:

【参考方案3】:

您可能想要淡出/淡入声音,而不是立即将其设置为全 (1.0f) 或零 (0.0f) 音量。

这有点棘手,因为您需要一个异步任务来保持您的应用响应:

mpMain 是我的 MediaPlayer 实例,用于播放循环背景音乐。 我也在 OnPause() 和 OnResume() 中关心它。

方法playBackgroundMusic用于打开音乐,fadeOutBackgroundMusic关闭音乐,但通过淡出音量0.5秒(10*50,见while和Thread.sleep)。

我的 base-volume 是 0.8f,您可能希望将其作为异步任务的参数或使用静态全局变量。

public void playBackgroundMusic( Boolean isOn )
  if(isOn)
    // prevent conflics with async fade-out task
    if(mtask_fadeout_music!=null)
      mtask_fadeout_music.cancel(true);
      mtask_fadeout_music=null;
    
    if(mpMain==null)
      mpMain = MediaPlayer.create(this, R.raw.zin___piano_2_140bpm_32158);
      mpMain.setLooping(true);
      mpMain.setVolume(0.8f,0.8f);
      mpMain.start();                         
    
  
  else
    if(mtask_fadeout_music==null)
      fadeOutBackgroundMusic();
    
  


public void fadeOutBackgroundMusic()
  mtask_fadeout_music = (FadeOutMusic)new FadeOutMusic( ).execute( );



//
//  background processing ... fade out music stream
//
public class FadeOutMusic extends AsyncTask<String,Integer,String> 

  @Override
  protected String doInBackground(String... args) 
    float level = 0.8f;
    int i = 1;

    while(i<50)
        i++;
        if(mpMain != null)
          level=level*0.9f;
          mpMain.setVolume(level, level);         
        
        try 
          Thread.sleep(10);
         catch (InterruptedException e) 
          e.printStackTrace();
        
    
    return "dummy";
  

  @Override
  protected void onPostExecute( String dummy ) 
    if(mpMain != null)
      mpMain.setVolume(0,0);         
      mpMain.release();
      mpMain = null;  
    
    if(mtask_fadeout_music!=null)
      mtask_fadeout_music = null;
    
         

  @Override
  public void onCancelled() 
    if(mpMain != null)
      mpMain.setVolume(0,0);         
      mpMain.release();
      mpMain = null;  
    
    if(mtask_fadeout_music!=null)
      mtask_fadeout_music = null;
    
  

【讨论】:

【参考方案4】:

AudioManger.setStreamMute 已弃用。 使用下面的替代代码。

AudioManager am = getSystemService(Context.AUDIO_SERVICE);
// Change the stream to your stream of choice. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
       am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
     else 
       am.setStreamMute(AudioManager.STREAM_MUSIC, true);
    

【讨论】:

【参考方案5】:

我们可以使用以下方法来静音/取消静音或检查音频播放器是否处于静音状态

/**
 * To Mute or Un-mute using Audio Manager
 */
private fun updateMuteState(mute: Boolean) 
    activity?.let 
        getAudioManager(it).adjustStreamVolume(
            AudioManager.STREAM_MUSIC,
            if (mute) -100 else 100,
            0
        )
    


/**
 * Return true -> audio player is in mute state, false otherwise
 */
private fun isMute(): Boolean 
    activity?.let 
        getAudioManager(it).getStreamVolume(AudioManager.STREAM_MUSIC).let  volume ->
            return volume == 0
        
    
    return false


/**
 * To Get the Audio Manager
 */
private fun getAudioManager(context: Context) =
    context.getSystemService(Context.AUDIO_SERVICE) as AudioManager

【讨论】:

【参考方案6】:

试试这个...

   AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
manager.setStreamMute(AudioManager.STREAM_MUSIC, true);

它将静音整个媒体音量静音

【讨论】:

【参考方案7】:

试试这个

AudioManager am = getSystemService(Context.AUDIO_SERVICE);
// Request audio focus.
am.requestAudioFocus(listener, AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);

http://developer.android.com/training/managing-audio/audio-focus.html

【讨论】:

【参考方案8】:

即使在静音模式下,我也可以取消静音

 MediaPlayer mMediaPlayer = new MediaPlayer();
 mMediaPlayer.setDataSource(this, alarmUri);
 mMediaPlayer.setAudiostreamType(AudioManager.STREAM_MUSIC);
 mMediaPlayer.setVolume(0.7f,0.7f);
 mMediaPlayer.prepare();
 mMediaPlayer.start();

【讨论】:

以上是关于如何在android中静音MediaPlayer的主要内容,如果未能解决你的问题,请参考以下文章

如何通过代码使 SoundPool 静音?

如何以编程方式检测 android 手机是不是处于静音模式

Android如何给通知channel静音

Android如何给通知channel静音

通过 Phonegap 在 Android 中以编程方式设置静音模式

Android如何给通知channel静音