一、播放声音SoundPool


SoundPool播放短的音效,不能播放歌曲

可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音,
比如游戏中的爆破声,而mediaplayer适合播放长点的。
SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作, SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。

实例:

sp=new SoundPool(1,AudioManager.STREAM_MUSIC,0);

加载:

soundId = sp.load(this, R.raw.note1, 1);

播放,可设置慢速、快速、频率高低等

sp.play(soundId, 1, 1, 0, 0, 2.0f);


二、播放声音MediaPlay

MediaPlayer可播放长的声音,可后台播放

创建:

mp= MediaPlayer.create(this,R.raw.song);

释放:

mp.release();

相关资源准备、该下载就下载

mp.prepare();

播放:

mp.start();

三、录音MediaRecord

写入外部存储的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

录音权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

创建目录:

File dir=new File(Environment.getExternalStorageDirectory(),"sonunds");

if(!dir.exists())

{

dir.mkdir();//创建目录

}

创建文件:

File soundFile=new File(dir,System.currentTimeMillis()+".amr");

if(!soundFile.exists())

{

try//捕获一个异常

{

soundFile.createNewFile();

}

catch(IOException e)

{

e.printStackTrace();

}

}

指定输出

mr=new MediaRecorder();

mr.setOutputFile(soundFile.getAbsolutePath());/

准备并开始录制:

mr.prepare();

mr.start();

停止录制:

mr.stop();

案例分析:

界面,四个按钮:

<Button

android:id="@+id/btnPlaySound"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="PlaySound" />

<Button

android:id="@+id/btnPlaySong"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="PlaySong" />

<Button

android:id="@+id/btnRecordBegin"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="开始录制" />

<Button

android:id="@+id/btnRecordStop"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="停止录制" />

播放短的音效

sp=new SoundPool(1,AudioManager.STREAM_MUSIC,0);

soundId = sp.load(this, R.raw.note1, 1);

findViewById(R.id.btnPlaySound).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

sp.play(soundId, 1, 1, 0, 0,2.0f);

}

});

播放歌曲

findViewById(R.id.btnPlaySong).setOnClickListener(newView.OnClickListener() {

@Override

publicvoid onClick(View v) {

if (mp!=null) {

mp.start();

}

}

});

4)录音

findViewById(R.id.btnRecordBegin).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

startRecord();

}

privatevoid startRecord() {

if(mr==null)

{

File dir=new File(Environment.getExternalStorageDirectory(),"sonunds");

if(!dir.exists())

{

dir.mkdir();//创建目录

}

File soundFile=new File(dir,System.currentTimeMillis()+".amr");

if(!soundFile.exists())

{

try//捕获一个异常

{

soundFile.createNewFile();

}

catch(IOException e)

{

e.printStackTrace();

}

}

mr=new MediaRecorder();

mr.setAudioSource(MediaRecorder.AudioSource.MIC);//指定输入源

mr.setOutputFormat(MediaRecorder.AudioEncoder.AMR_WB);//输出编码格式

mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//输入编码格式

mr.setOutputFile(soundFile.getAbsolutePath());//指定输出

try {

mr.prepare();

mr.start();

} catch (IllegalStateException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

}

}

});

5)停止录音

findViewById(R.id.btnRecordStop).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

stopRecord();

}

privatevoid stopRecord() {

if(mr!=null)

{

mr.stop();

mr.release();

mr=null;

}

}

});

6)权限设置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.RECORD_AUDIO" />


×××: