android 音量调整-阿里云开发者社区

开发者社区> 开发与运维> 正文

android 音量调整

简介:

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





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章