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 items;
List paths;
private String rootPath = "/";
public void getFileDir(String filePath) {
try{
items = new ArrayList();
paths = new ArrayList();
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);//设置左右声道都有声音
}
}
对于SoundPool 这个可以看看这个:http://blog.csdn.net/wangdong20/article/details/8567557
Dmeo:http://download.csdn.net/detail/u012808234/9460595