1、音频播放
1、播放本地音乐
public class MainActivity extends Activity implements View.OnClickListener {
private Button mButton;
private SeekBar mSeekbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
mSeekbar = (SeekBar) findViewById(R.id.seekBar);
mButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
MediaPlayer player = new MediaPlayer();
player.reset();
Log.d("", "" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath());
File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);//找到sdcard下music文件夹的文件
File[] musics = musicDir.listFiles();
try {
player.setDataSource(musics[0].getAbsolutePath());//播放第一个文件
player.prepare();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、播放提示音
注意:不能直接将pool.play(id, 1, 1, 0, -1, 1);写在一个方法中然后在onCreate中调用,因为这个过程需要时间,这样写就无法播放。正确的写法,应该是将pool.play(id, 1, 1, 0, -1, 1);写在onCreat中。如下:
public class MainActivity extends Activity {
private Button mButton;
private int id;
private SoundPool pool = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
id = init();
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pool.play(id, 1, 1, 0, -1, 1);
}
});
}
private int init() {
if (Build.VERSION.SDK_INT > 21) {
SoundPool.Builder builder = new SoundPool.Builder();
builder.setMaxStreams(2);
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
builder.setAudioAttributes(attrBuilder.build());
pool = builder.build();
} else {
pool = new SoundPool(2, AudioManager.STREAM_MUSIC, 1);
}
return pool.load(getApplicationContext(), R.raw.outgoing, 1);
}
}
2、音频录制
public class MediaRecorderActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButtonStart;
private Button mButtonStop;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonStart = (Button) findViewById(R.id.button_start);
mButtonStop = (Button) findViewById(R.id.button_stop);
mButtonStart.setOnClickListener(this);
mButtonStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_start:
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源,MIC是手机上的麦克风
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//代表输出文件的格式。
// 该语句必须在setAudioSource之后,在prepare之前。
//OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码,
// AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/myrecord.3gp");// 设置录音之后,保存音频文件的位置
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.button_stop:
mediaRecorder.stop();
mediaRecorder.reset();// 重置录音 ,会重置到setAudioSource这一步
mediaRecorder.release();//解除对录音资源的占用
break;
}
}
}