Android播放音频

概述

Android提供了对常用音频和视频格式的支持,它所支持的音频格式有MP3(.mp3)、3GPP(.3gp)等,支持视频格式有3GPP和MPEG-4等。

使用MediaPlayer类播放音频

在Android中,提供了MediaPlayer类来播放音频。使用MediaPlayer类播放音频比较简单,只需要创建该类对象,并为其指定要播放的音频文件,然后调用该类的start()方法播放。MediaPlayer类中有许多方法,如

  • create(Context content,int resid) 指定资源ID创建一个MediaPlayer对象
  • create(Context context,Uri uri) 指定URI创建一个MediaPlayer对象
  • setDataSource() 指定要装载的资源
  • prepare() 准备播放(播放前调用)
  • start() 开始播放
  • stop() 停止播放
  • pause() 暂停播放
  • reset() 恢复MediaPlayer到未初始化状态

1.创建MediaPlayer对象并装载音频文件
(1) 使用create()方法创建MediaPlayer对象加载音频文件
MediaPlayer提供的create()常用语法格式有以下两种:

	//音频资源res\raw\d.wav
	MediaPlayer player = new MediaPlayer.create(this,R.raw.d);

指定URI来装载音频.

	MediaPlayer player = new MediaPlayer.create(this,Uri.parse("http://"));

在访问网络中的资源时,要在AndroidManifest.xml文件中授予网络的权限.


(2) 通过无参的构造函数创建MediaPlayer并加载资源.

	MediaPlayer player = new Mediaplayer();
	try{
		player.setDataSource("/sdcard/music.mp3");
		player.prepare();
	}catch(Exception e){
		e.printStackTrace();
	}

说明:

  • 通过create方法创建,已经加载资源,适用于播放单独的音频文件。
  • 无参构造方法创建并加载音频文件,适用于连续播放多个文件。

播放

	player.start();	//开始或恢复
	player.stop();	//停止播放
	player.pause();	//暂停播放



使用SoundPool类播放音频

可以同时播放多个短小的音频,而且占用资源较少.
一、创建SoundPool对象

	SoundPool(int maxStreams,int streamType int srcQuality);
	//容纳多少音频,指定声音类型,通常用STREAM_MUSIC.
	//srcQuality音频品质,默认为0

java方法:

  • setAudioAttributes(AudioAttributes) 设置音效池的属性
  • setMaxStreams(10) 设置最多可容纳10个音频流,

二、加载所要播放的音频
创建对象后,调用load()对象加载播放的音频。

	public int load(Context context,int resID,int priority);	//context一般this,表示该活动,resID资源ID,priority优先级

例如,通过资源ID来加载音频文件ding.wav

soundpool.load(this,R.raw.ding,1);	//Context,resID,priority

为了更好的管理所加载的每个音频,一般使用HashMap对象来管理,使用put()方法将加载的音频保存到该对象中。

	HashMap<Integer,Integer> soundmap = new HashMap<Integer,Integer>();
	soundmap.put(1,soundpool.load(this,R.raw.chims,1));

三、播放音频

	play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate)
	//ID,播放的音频,一般是一个soundpool对象,通过load加载,左右音量,优先级,循环次数,指定速率,正常为1

实例:
模仿手机选择铃声:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listview = (ListView) findViewById(R.id.listView);   //获取列表视图
        String[] title = new String[]{"布谷鸟叫声", "风铃声", "门铃声", "电话声", "鸟叫声",
                "水流声", "公鸡叫声"};               // 定义并初始化保存列表项文字的数组
        List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();  //创建一个list集合
        //通过for循环将列表项文字放到Map中,并添加到list集合中
        for (int i = 0; i < title.length; i++) {
            Map<String, Object> map = new HashMap<String, Object>();             //实例化Map对象
            map.put("name", title[i]);
            listItems.add(map);                                     //将map对象添加到List集合中
        }

        AudioAttributes attr = new AudioAttributes.Builder()           //设置音效相关属性
                .setUsage(AudioAttributes.USAGE_GAME)                 // 设置音效使用场景
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)  // 设置音效的类型
                .build();
        final SoundPool soundpool = new SoundPool.Builder()           // 创建SoundPool对象
                .setAudioAttributes(attr) // 设置音效池的属性
                .setMaxStreams(10) // 设置最多可容纳10个音频流,
                .build();

        //创建一个HashMap对象,将要播放的音频流保存到HashMap对象中
        final HashMap<Integer, Integer> soundmap = new HashMap<Integer, Integer>();
        soundmap.put(0, soundpool.load(this, R.raw.cuckoo, 1));
        soundmap.put(1, soundpool.load(this, R.raw.chimes, 1));
        soundmap.put(2, soundpool.load(this, R.raw.notify, 1));
        soundmap.put(3, soundpool.load(this, R.raw.ringout, 1));
        soundmap.put(4, soundpool.load(this, R.raw.bird, 1));
        soundmap.put(5, soundpool.load(this, R.raw.water, 1));
        soundmap.put(6, soundpool.load(this, R.raw.cock, 1));

        //创建SimpleAdapter适配器并将适配器与ListView关联
        SimpleAdapter adapter = new SimpleAdapter(this, listItems,
                R.layout.main, new String[]{"name",}, new int[]{
                R.id.title}); // 创建SimpleAdapter
        listview.setAdapter(adapter); // 将适配器与ListView关联

        //为ListView设置事件监听器,为每个选项设置所对应要播放的音频
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //获取选项的值,可以显示点击的目标
                Map<String, Object> map = (Map<String, Object>) parent.getItemAtPosition(position);
                soundpool.play(soundmap.get(position), 1, 1, 0, 0, 1);  //播放所选音频
            }
        });
    }
}

你可能感兴趣的:(安卓)