SoundPool類
SoundPool類適合用來播放一些短暫的反應速度要求高的聲音。SoundPool載入音樂文件使用了獨立的線程,不會阻塞UI主線程的操作。SoundPool類支持同時播放多個音效。 應用實例如下:
public class MainActivity extends Activity {
private SoundPool sp;
private int soundID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* maxStreams : 音源的個數 streamType : 音源的類型 srcQuality : 音源的質量
*/
sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
// 實例化AudioManager對象,控制聲音
AudioManager am = (AudioManager) this
.getSystemService(MainActivity.AUDIO_SERVICE);
// 最大音量
float audioMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 當前音量
float audioCurrentVolumn = am
.getStreamVolume(AudioManager.STREAM_MUSIC);
float volumnRatio = audioCurrentVolumn / audioMaxVolumn;
// 裝載音源,返回相應的id
soundID = sp.load(this, R.raw.song, 1);
// 播放聲音,priority:優先級,0最低,loop:循環次數,0是不循環,-1是永遠循環,rate:回放速度,0.5-2.0之間,1爲正常速度
// sp.play(soundID, leftVolume, rightVolume, priority,loop, rate);
sp.play(soundID, volumnRatio, volumnRatio, 1, 0, 1);
}
}
MediaPlayer類
使用MediaPlayer類來播放音頻文件
public class Main extends Activity implements OnClickListener,OnCompletionListener
{
private MediaPlayer mediaPlayer;
private Button btnPause;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnStart1 = (Button)findViewById(R.id.btnStart1);
Button btnStart2 = (Button)findViewById(R.id.btnStart2);
Button btnStop = (Button)findViewById(R.id.btnStop);
btnPause = (Button)findViewById(R.id.btnPause);
btnStart1.setOnClickListener(this);
btnStart2.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPause.setOnClickListener(this);
}
// 回掉方法,監聽音頻文件播放完畢
public void onCompletion(MediaPlayer mp)
{
mp.release();
setTitle("釋放資源");
}
public void onClick(View view)
{
try
{
switch (view.getId()) {
case R.id.btnStart1: // 播放工程目錄下的文件
mediaPlayer = MediaPlayer.create(this, R.raw.music);
mediaPlayer.setOnCompletionListener(this);
// 不需要調用prepare()方法,因爲在create()中已經調用過了
mediaPlayer.start();
break;
case R.id.btnStart2:// 播放SD卡上的音頻文件(/sdcard/music.mp3)
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("/sdcard/music.mp3");
mediaPlayer.prepare();
mediaPlayer.start();
break;
case R.id.btnStop:
if(mediaPlayer != null)
{
if(mediaPlayer.isPlaying())
mediaPlayer.stop();
}
break;
case R.id.btnPause:
if(mediaPlayer != null)
{
if("播放".equals(btnPause.getText().toString()))
{
mediaPlayer.start();
btnPause.setText("暫停");
}
else if("暫停".equals(btnPause.getText().toString()))
{
mediaPlayer.pause();
btnPause.setText("播放");
}
}
break;
default:
break;
}
}
catch (Exception e) {
// TODO: handle exception
}
}
}
使用MediaPlayer類來播放視頻文件
public class MainActivity extends Activity {
private SurfaceView sv;
private SurfaceHolder sh;
private Callback callback = new Callback() {
MediaPlayer mp = null;
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
if (mp != null) {
mp.stop();// 停止播放
mp.release();// 釋放資源
mp = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mp = MediaPlayer.create(this, R.raw.move);
try {
mp.prepare();// 準備播放
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.setDisplay(sh);
mp.start();// 播放視頻
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sv = new SurfaceView(this);
sh = sv.getHolder();
sh.addCallback(callback);
setContentView(sv);
}
}
使用VideoView類來播放視頻文件
<span style="font-size:14px;">public class MainActivity extends Activity {
private VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vv = new VideoView(this);
setContentView(vv);
vv.setVideoPath("/mnt/sdcard/movie.mp4");
vv.setMediaController(new MediaController(this));
}
}</span>
更詳細MediaPlayer類介紹:http://www.eoeandroid.com/thread-176453-1-1.html(引用)
MediaRecorder錄音
需要獲取的權限:<uses-permission android:name="android.permission.RECORD_AUDIO" />
<span style="font-size:14px;">public class MainActivity extends Activity {
private MediaRecorder mr;
private Button btnStart;// 開始錄音按鈕
private Button btnStop;// 停止錄音按鈕
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
startRecord();// 開始錄音
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
stopRecord();// 停止錄音
}
});
}
// 停止錄音方法
protected void stopRecord() {
if (mr != null) {
mr.stop();
mr.release();
mr = null;
}
}
// 開始錄音方法
protected void startRecord() {
if (mr == null) {
// 在sdcard卡下創建相應的文件目錄
File dir = new File(Environment.getExternalStorageDirectory(),
"sounds");
if (!dir.exists()) {
dir.mkdir();
}
// 創建錄音文件
File file = new File(dir, System.currentTimeMillis() + "amr");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
mr = new MediaRecorder();// 創建對象
// 設置錄音源
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
// 設置輸出格式
mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
// 設置音源編碼
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
// 設置輸出路徑
mr.setOutputFile(file.getAbsolutePath());
try {
mr.prepare();// 準備錄音
mr.start();// 開始錄音
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}</span>
通過調用系統的攝像頭來進行拍照
public class Main extends Activity implements OnClickListener
{
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTakePicture = (Button)findViewById(R.id.btnTakePicture);
btnTakePicture.setOnClickListener(this);
imageView = (ImageView)findViewById(R.id.imageview);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == 1)
{
if(resultCode == Activity.RESULT_OK)
{
Bitmap cameraBitmap = (Bitmap)data.getExtras().get("data");
imageView.setImageBitmap(cameraBitmap);
}
}
}
public void onClick(View view)
{
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
}
通過調用系統的攝像頭來進行錄像
public class Main extends Activity implements OnClickListener {
public VideoView videoView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
btnTakePicture.setOnClickListener(this);
videoView = (VideoView) findViewById(R.id.videoview);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1)
{
if(resultCode == Activity.RESULT_OK)
{
Uri uri = data.getData();
Cursor cursor = this.getContentResolver().query(uri,null,null,null,null);
if(cursor.moveToFirst())
{
String videoPath = cursor.getString(cursor.getColumnIndex("_data"));
videoView.setVideoURI(Uri.parse(videoPath));
videoView.setMediaController(new MediaController(this));
videoView.start();
}
}
}
}
public void onClick(View view) {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intent, 1);
}
}