本文所讲内容是如何使用AudioManager来调节播放器的音量。首先说说大体的思路:用ProgressBar控件显示当前音量的大小;在Button控件的单击事件中改变音量的大小;最后也是最重要的是用什么控制音量,查了下资料,发现AudioManager可以调节各种类型的声音的音量,例如音乐声音、通话声音和铃声声音等。本文中所讲的是调节音乐的声音。

       本文涉及到的关键技术点包括:ProgressBar的使用、用MediaPlayer播放MP3音乐和AudioManager的使用。

       下面分步骤讲解:

       第一步:新建一个工程,命名为AudioManagerVolume,Activity命名为AdjustVolumeActivity。

       修改布局文件main.xml。修改后的代码如下:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>      
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"      
  3.     Android:orientation="vertical" android:layout_width="fill_parent"      
  4.     Android:layout_height="fill_parent" android:background="#FFFFFF">      
  5.     <Button Android:id="@+id/play" android:layout_width="wrap_content"      
  6.         Android:layout_height="wrap_content" android:text="播放MP3音乐" />      
  7.     <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"      
  8.         Android:orientation="horizontal" android:layout_width="fill_parent"      
  9.         Android:layout_height="fill_parent">      
  10.         <Button Android:id="@+id/down" android:layout_width="wrap_content"      
  11.             Android:layout_height="wrap_content"  android:text="减小" />      
  12.         <ProgressBar Android:id="@+id/progress"      
  13.             style="?Android:attr/progressBarStyleHorizontal"      
  14.             Android:layout_width="150dip" android:layout_height="wrap_content"      
  15.             />      
  16.         <Button Android:id="@+id/up" android:layout_width="wrap_content"      
  17.             Android:layout_height="wrap_content" android:text="增大" />      
  18.     </LinearLayout>      
  19. </LinearLayout>  

       第二步:修改AdjustVolumeActivity类。修改后代码如下:

Java代码
  1. package com.zyg.demo.adjustvolume;      
  2.       
  3. import java.io.IOException;      
  4.       
  5. import Android.app.Activity;      
  6. import Android.content.Context;      
  7. import Android.content.res.AssetFileDescriptor;      
  8. import Android.content.res.AssetManager;      
  9. import Android.media.AudioManager;      
  10. import Android.media.MediaPlayer;      
  11. import Android.os.Bundle;      
  12. import Android.view.View;      
  13. import Android.view.View.OnClickListener;      
  14. import Android.widget.Button;      
  15. import Android.widget.ProgressBar;      
  16.       
  17. import com.zyg.demo.progressbar.R;      
  18.       
  19. public class AdjustVolumeActivity extends Activity implements OnClickListener {      
  20.     private Button play = null;      
  21.     private Button down = null;      
  22.     private Button up = null;      
  23.       
  24.     private ProgressBar pb = null;      
  25.     private int maxVolume = 50// 最大音量值       
  26.     private int curVolume = 20// 当前音量值       
  27.     private int stepVolume = 0// 每次调整的音量幅度       
  28.       
  29.     private MediaPlayer mediaPlayer = null;// 播放器       
  30.     private AudioManager audioMgr = null// Audio管理器,用了控制音量       
  31.     private AssetManager assetMgr = null// 资源管理器       
  32.       
  33.     private final String musicName = "hehe.MP3";      
  34.       
  35.     @Override      
  36.     public void onCreate(Bundle savedInstanceState) {      
  37.         super.onCreate(savedInstanceState);      
  38.         setContentView(R.layout.main);      
  39.       
  40.         // 初始化播放器、音量数据等相关工作       
  41.         initPlayWork();      
  42.         // 初始化视图       
  43.         initUI();      
  44.     }      
  45.       
  46.     /**    
  47.      * 初始化UI    
  48.      */      
  49.     private void initUI() {      
  50.         play = (Button) findViewById(R.id.play);      
  51.         down = (Button) findViewById(R.id.down);      
  52.         up = (Button) findViewById(R.id.up);      
  53.       
  54.         play.setOnClickListener(this);      
  55.         down.setOnClickListener(this);      
  56.         up.setOnClickListener(this);      
  57.         // 设置进度条       
  58.         pb = (ProgressBar) findViewById(R.id.progress);      
  59.         pb.setMax(maxVolume);      
  60.         pb.setProgress(curVolume);      
  61.     }      
  62.       
  63.     /**    
  64.      * 初始化播放器、音量数据等相关工作    
  65.      */      
  66.     private void initPlayWork() {      
  67.         audioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);      
  68.         // 获取最大音乐音量       
  69.         maxVolume = audioMgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);      
  70.         // 初始化音量大概为最大音量的1/2       
  71.         curVolume = maxVolume / 2;      
  72.         // 每次调整的音量大概为最大音量的1/6       
  73.         stepVolume = maxVolume / 6;      
  74.       
  75.         mediaPlayer = new MediaPlayer();      
  76.         assetMgr = this.getAssets();      
  77.     }      
  78.       
  79.     /**    
  80.      * 准备播放音乐    
  81.      *     
  82.      * @param music    
  83.      */      
  84.     private void prepareAndPlay() {      
  85.         try {      
  86.             // 打开指定音乐文件       
  87.             AssetFileDescriptor afd = assetMgr.openFd(musicName);      
  88.             mediaPlayer.reset();      
  89.             // 使用MediaPlayer加载指定的声音文件。       
  90.             mediaPlayer.setDataSource(afd.getFileDescriptor(),      
  91.                     afd.getStartOffset(), afd.getLength());      
  92.             // 准备声音       
  93.             mediaPlayer.prepare();      
  94.             // 播放       
  95.             mediaPlayer.start();      
  96.         } catch (IOException e) {      
  97.             e.printStackTrace();      
  98.         }      
  99.     }      
  100.       
  101.     /**    
  102.      * 调整音量    
  103.      */      
  104.     private void adjustVolume() {      
  105.         audioMgr.setStreamVolume(AudioManager.STREAM_MUSIC, curVolume,      
  106.                 AudioManager.FLAG_PLAY_SOUND);      
  107.     }      
  108.       
  109.     @Override      
  110.     public void onClick(View v) {      
  111.         int id = v.getId();      
  112.         switch (id) {      
  113.         case R.id.play://按下播放按钮       
  114.             prepareAndPlay();      
  115.             break;      
  116.         case R.id.up://按下增大音量按钮       
  117.             curVolume += stepVolume;      
  118.             if (curVolume >= maxVolume) {      
  119.                 curVolume = maxVolume;      
  120.             }      
  121.             pb.setProgress(curVolume);      
  122.             break;      
  123.         case R.id.down://按下减小音量按钮       
  124.             curVolume -= stepVolume;      
  125.             if (curVolume <= 0) {      
  126.                 curVolume = 0;      
  127.             }      
  128.             pb.setProgress(curVolume);      
  129.             break;      
  130.         default:      
  131.             break;      
  132.         }      
  133.         // 调整音量       
  134.         adjustVolume();      
  135.     }      
  136. }    

       备注:有的文章中提到需要添加权限<uses-permission Android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ,我这里并没有添加,可以正常运行。

本文发布:Android开发网
本文地址:http://www.teaching4real.com/android/example/218.html
2012年9月25日
发布:鸡啄米 分类:Android开发实例 浏览: 注册送白菜网:2