文章出处:http://blog.youkuaiyun.com/scarthr/article/details/42641717
一 媒体播放
1. SoundPool
SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
int soundId = sp.load(this, R.raw.sogn, 0);
sp.play(soundId, 1, 1, 0, 0, 1);
SoundPool不能播放比较大的歌曲,一般是用来播放很小的游戏音效的。
load最后1个参数是优先级,0最低,1最高。
play第1个参数是音频的id,第2、3是左右声道的大小值,0最小,1最大。第4个是优先级,第5个是是否循环,0不循环,-1永久循环,最后一个参数是播放速率,0~2取值,1是正常。
2. MediaPlayer
MediaPlayer类既可以播放音频也可以播放视频。
播放声音:
try {
mp.prepare();
if (mp != null) {
mp.start();
// 释放资源
// mp.release();
}
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
播放视频:
我们在SurfaceView上播放视频:
SurfaceView sv = new SurfaceView(this);
SurfaceHolder holder = sv.getHolder();
final MediaPlayer mp;
holder.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mp.release();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mp = MediaPlayer.create(MainActivity.this, R.raw.movie);
try {
mp.prepare();
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
mp.setDisplay(holder);
mp.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
3. VideoView
这是一个专门用来播放视频的控件,使用也非常简单:
VideoView vv = new VideoView(this);
vv.setVideoPath("/mnt/sdcard/movie.mp4");
vv.setMediaController(new MediaController(this));
直接调用系统的一个控制器,点击播放按钮就可以播放。二 相机
1. 自己预览相机
如果我们想预览摄像头拍摄的内容,需要一个SurfaceView来呈现。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
主程序:
package com.thr.testxmlsax;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
private SurfaceView sv;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv = (SurfaceView) findViewById(R.id.sv);
sv.getHolder().addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 拍照
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String path;
if ((path = saveTempFile(data)) != null) {
// 存储图片并启动新Activity
Intent intent = new Intent(MainActivity.this,
ImagePreViewActivity.class);
intent.putExtra("path", path);
startActivity(intent);
} else {
// 保存失败
}
}
});
}
});
}
/**
* 保存拍照临时文件
*
* @param buffer
* @return
*/
private String saveTempFile(byte[] buffer) {
try {
File file = File.createTempFile("img", "");
FileOutputStream fos = new FileOutputStream(file);
fos.write(buffer);
fos.flush();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 开始预览
*/
private void startPreview() {
try {
camera = Camera.open();
camera.setPreviewDisplay(sv.getHolder());
// 设置相机旋转90度
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 停止预览
*/
private void stopPreview() {
camera.stopPreview();
camera.release();
}
}
ImagePreViewActivity:
package com.thr.testxmlsax;
import java.io.File;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;
public class ImagePreViewActivity extends Activity {
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iv = new ImageView(this);
setContentView(iv);
String path = getIntent().getStringExtra("path");
if (path != null) {
iv.setImageURI(Uri.fromFile(new File(path)));
}
}
}
记得在显示的Activity配置文件中添加:
android:screenOrientation="portrait"
控制屏幕不要旋转。
还要添加相机和外部存储的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 调用系统相机
package com.thr.testxmlsax;
import java.io.File;
import java.io.IOException;
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.view.View.OnClickListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
private static final int REQUEST_CODE_TAKE_PICTURE = 1;
private File imageFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
File dir = new File(Environment.getExternalStorageDirectory(),
"pictures");
// 如果目录不存在就创建目录
if (!dir.exists()) {
dir.mkdirs();
}
imageFile = new File(dir, System.currentTimeMillis() + ".jpg");
if (!imageFile.exists()) {
try {
imageFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(imageFile));
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_TAKE_PICTURE:
iv.setImageURI(Uri.fromFile(imageFile));
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
同样不要忘记加相机和外部存储两个权限。
三 录音
findViewById(R.id.btn_start).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mr == null) {
File dir = new File(Environment
.getExternalStorageDirectory(), "sound");
if (!dir.exists()) {
dir.mkdirs();
}
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();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
findViewById(R.id.btn_stop).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mr != null) {
mr.stop();
mr.release();
mr = null;
}
}
});
也不要忘记添加录音和外部存储权限。