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));//得到图片
}
}
}
}