android 音量调整

来源:互联网 发布:mac怎么玩魔兽争霸 编辑:程序博客网 时间:2024/05/16 23:38

Android调整音量是通过AudioManager来进行控制的,他也是一个服务,通过这个manager可以控制音量的大小,静音,是否显示音量控制条,等等。

这个服务的使用步骤:

(1)获取AudioManager服务

(2)设置要控制的控制的音频流

(3)通过publicvoidadjustStreamVolume (intstreamType, intdirection, intflags) 来控制音量的大小

例: 

 AudioManager audioManager ;

  audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
  setVolumeControlStream(AudioManager.STREAM_MUSIC);

audioManager.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); 

这个方法就是调整音量的方法,里边的第一个参数是

(a)需要调整音量的类型,这里设的是媒体音量,可以是: 

STREAM_ALARM 警报 

STREAM_MUSIC 音乐回放即媒体音量 

STREAM_NOTIFICATION 窗口顶部状态栏Notification, 

STREAM_RING 铃声 

STREAM_SYSTEM 系统 

STREAM_VOICE_CALL 通话 

STREAM_DTMF 双音多频,

(b)

第二个direction,是调整的方向,增加或减少,可以是: 

ADJUST_LOWER 降低音量 

ADJUST_RAISE 升高音量 

ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量 

(c)第三个flags是一些附加参数,只介绍两个常用的 

FLAG_PLAY_SOUND 调整音量时播放声音 

FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个 

0表示什么也没有 

上边这是依次进行加大或是变小,也可以直接设置最大跟最小

am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND); 

am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的最大值

am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的当前值

第一个和第三个参数与上面的相同第二个参数是一个音量的int值,getStreamMaxVolume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.

对于系统的声音等等都可以进行调整,也就是在  setVolumeControlStream(AudioManager.STREAM_MUSIC);这个方法里边所传的类型进行改变就好,类型包括:

AudioManager.STREAM_MUSIC  /音乐回放即媒体音量/

AudioManager.STREAM_RING /铃声/

AudioManager.STREAM_ALARM  /警报/

AudioManager.STREAM_NOTIFICATION /窗口顶部状态栏通知声/

AudioManager.STREAM_SYSTEM  /系统/

AudioManager.STREAM_VOICECALL /通话 /

AudioManager.STREAM_DTMF /双音多频,/

但是这是系统的声音,当你调整的时候整体都会变,如果你现在在听歌,然后你又在玩游戏,这个时候俩个声音调整应该没有冲突才算好的体验,游戏中中很多爆炸,碰撞等等的声音也可以用MediaPlayer来进行播放,或是用SoundPool soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);这个类来进行播放,他们都提供了可以设置的左右声道的音量。

我用MediaPlayer写了个Demo:

package com.example.mediaplayerdemo;    import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.Service;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;/**  * @description 通过SurfaceView/SurfaceHolder实现自己的播放器  * @author chenzheng_java  * @since 2011/03/23  * @description 这里进行一下补充说明,我们可以通过mediaplayer添加OnPreparedListener  *  以及OnCompletionListener等事件对准备好播放以及播放完成后的操作进行控制。  * 使用SurfaceView以及SurfaceHolder进行视频播放时,结构是这样的:  * 1、首先,我们从布局文件中获取一个surfaceView  * 2、通过surfaceView.getHolder()方法获取与该容器想对应的surfaceHolder  * 3、对srufaceHolder进行一些默认的设置,如addCallback()和setType()  * 4、通过mediaPlayer.setDisplay()方法将视频播放与播放容器链接起来  */  public class MainActivity extends Activity {        MediaPlayer mediaPlayer ; // 播放器的内部实现是通过MediaPlayer      SurfaceView surfaceView ;// 装在视频的容器      SurfaceHolder surfaceHolder;// 控制surfaceView的属性(尺寸、格式等)对象      boolean isPause ; // 是否已经暂停了            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);         surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);          /**          * 获取与当前surfaceView相关联的那个的surefaceHolder          */          surfaceHolder = surfaceView.getHolder();          /**          * 注册当surfaceView创建、改变和销毁时应该执行的方法          */          surfaceHolder.addCallback(new SurfaceHolder.Callback() {                            @Override              public void surfaceDestroyed(SurfaceHolder holder) {                  Log.i("通知", "surfaceHolder被销毁了");                  if(mediaPlayer!=null)                  mediaPlayer.release();              }                            @Override              public void surfaceCreated(SurfaceHolder holder) {                  Log.i("通知", "surfaceHolder被create了");                  mediaPlayer = new MediaPlayer();                  // 设置多媒体流类型                  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);                  // 设置用于展示mediaPlayer的容器                  mediaPlayer.setDisplay(surfaceHolder);              }                            @Override              public void surfaceChanged(SurfaceHolder holder, int format, int width,                      int height) {                  Log.i("通知", "surfaceHolder被改变了");              }          });                    /**          *  这里必须设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思          *  是创建一个push的'surface',主要的特点就是不进行缓冲          */          surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);          getFileDir("/mnt/shell");        audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);        setVolumeControlStream(AudioManager.STREAM_MUSIC);    }      List<String> items;    List<String> paths;    private String rootPath = "/";      public void getFileDir(String filePath) {          try{              items = new ArrayList<String>();              paths = new ArrayList<String>();              File f = new File(filePath);              File[] files = f.listFiles();// 列出所有文件              // 如果不是根目录,则列出返回根目录和上一目录选项              if (!filePath.equals(rootPath)) {                  items.add("返回根目录");                  paths.add(rootPath);                  items.add("返回上一层目录");                  paths.add(f.getParent());              }              // 将所有文件存入list中              if(files != null){                  int count = files.length;// 文件个数                  for (int i = 0; i < count; i++) {                      File file = files[i];                      items.add(file.getName());                      paths.add(file.getPath());                  }              }            }catch(Exception ex){              ex.printStackTrace();          }            for (int i = 0; i < paths.size(); i++) {        Log.e("通知", paths.get(i)); }    }      /***      * @param targetButton 被用户点击的按钮      */      public void buttonClick(View targetButton){          int buttonId = targetButton.getId();          switch (buttonId) {          case R.id.button_play:              play();              break;          case R.id.button_pause:              pause();              break;          case R.id.button_reset:              reset();              break;          case R.id.button_stop:              stop();              break;          default:              break;          }                }            /**      * 播放      */      private void play(){                    AssetFileDescriptor assetFileDescriptor;        try {      assetFileDescriptor = this.getAssets().openFd("aa.mp4");            mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(),assetFileDescriptor.getLength());;              mediaPlayer.prepare();              mediaPlayer.start();              isPause = false;          } catch (Exception e) {              Log.i("通知", "播放过程中出现了错误哦");          }      }            /**      * 暂停      */      private void pause(){          Log.i("通知", "点击了暂停按钮");          if(isPause==false){              mediaPlayer.pause();              isPause=true;          }else{              mediaPlayer.start();              isPause=false;          }                          }        AudioManager audioManager ;    /**      * 重置      */      private void reset(){       audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);//调小音量//    mediaPlayer.setVolume(0, 0); //直接设置静音    }    /* 停止      */      private void stop(){       audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);//调大音量//     mediaPlayer.setVolume(1, 1);//设置左右声道都有声音    }              }  

可以看到,是通过MediaPlayer的setVolume(int left,int right)这个方法来进行设置,里边就是左右声道的大小,这个0是最小,1是最大,可以按照需要调整。

对于SoundPool 这个可以看看这个:http://blog.csdn.net/wangdong20/article/details/8567557

Dmeo:http://download.csdn.net/detail/u012808234/9460595





0 0
原创粉丝点击