SoundPool
提示音,適合短促且對反應速度比較高的情況(遊戲音效或按鍵聲等),一般文件較小,只有幾十K,使用MediaPlayer會浪費內存,所以用SoundPool。
priority —— 流的優先級,值越大優先級高,影響當同時播放數量超出了最大支持數時SoundPool對該流的處理;
loop —— 循環播放的次數,0爲值播放一次,-1爲無限循環,其他值爲播放loop+1次(例如,3爲一共播放4次).
rate —— 播放的速率,範圍0.5-2.0(0.5爲一半速率,1.0爲正常速率,2.0爲兩倍速率)
1.管理多個音頻資源,通過load()函數,成功則返回非0的soundID;
2.同時播放多個音頻,通過play()函數,成功則返回非0的streamID;
3.pause()、resume()和stop()等操作是針對streamID(播放流)的;
4.當設置爲無限循環時,需要手動調用stop()來終止播放;
5.播放流的優先級(play()中的priority參數),只在同時播放數超過設定的最大數時起作用;
6.程序中不用考慮(play觸發的)播放流的生命週期,無效的soundID/streamID不會導致程序錯誤。
package com.example.administrator.mymusicplayer;
import android.app.Activity;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* Created by Administrator on 2015/9/15.
*/
public class SoundPoolActivity extends Activity {
private Button mButtonSoundPool;
private static int voiceID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_soundpool);
mButtonSoundPool = (Button) findViewById(R.id.button_soundpool);
mButtonSoundPool.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
playSound();
}
});
voiceID = initSoundPool();
}
private SoundPool pool = null;
public void playSound() {
pool.play(voiceID, 1, 1, 0, 0, 1);
}
private int initSoundPool() {
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, 0);
}
return pool.load(getApplicationContext(), R.raw.outgoing, 1);
}
}
MediaRecorder
錄製音視頻
錄製結束時,調用stop方法,並且調用reset、release方法釋放掉資源。
注意加上權限:
package com.example.administrator.mymusicplayer;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends Activity 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_recorder);
mButtonStop = (Button) findViewById(R.id.button_stop_recorder);
mButtonStart.setOnClickListener(this);
mButtonStop.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_start_recorder:
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/MyRecorder.mp3");
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.button_stop_recorder:
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
break;
}
}
}
VedioView
視頻播放,僅限於mp4和3gp格式。
注意權限:
package com.example.administrator.mymusicplayer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
/**
* Created by Administrator on 2015/9/15.
*/
public class VideoViewActivity extends Activity {
private Button mButtonStart;
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vedioview);
mButtonStart = (Button) findViewById(R.id.button_start);
videoView = (VideoView) findViewById(R.id.videoview);
mButtonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
videoView.setVideoPath(Environment.getExternalStorageDirectory()+"/VID_20150502_090524.3gp");
videoView.setMediaController(new MediaController(VideoViewActivity.this));
videoView.start();
}
});
}
}
SurfaceView
自帶繪製線程,SurfaceView是視圖(View)的繼承類,這個視圖裏內嵌了一個專門用於繪製的Surface。
注意權限:
package com.example.administrator.mymediasurfaceview;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends Activity {
private Button mButtonStart;
private SurfaceView mSurfaceView;
private MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonStart = (Button) findViewById(R.id.button_start);
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
mButtonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (player == null){
player = new MediaPlayer();
}
player.reset();
try {
player.setDataSource(Environment.getExternalStorageDirectory()+"/VID_20150502_090524.3gp");
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDisplay(mSurfaceView.getHolder());
player.prepare();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
Camera
這裏給一個例子,調用系統的照相機拍攝一張照片並顯示。
package com.example.administrator.mymediasurfaceview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
import java.io.IOException;
/**
* Created by Administrator on 2015/9/15.
*/
public class CameraActivity extends Activity {
private Button mButtonStartCamera;
private ImageView mImageView;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mButtonStartCamera = (Button) findViewById(R.id.button_start_camera);
mImageView = (ImageView) findViewById(R.id.imageview);
mButtonStartCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//隱式啓動系統相機
file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//告訴系統相機將照片保存的位置
startActivityForResult(intent,0x23);//開始啓動
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==0x23){
if (resultCode==RESULT_OK){
mImageView.setImageURI(Uri.fromFile(file));//得到圖片
}
}
}
}