MediaRecorder
这个类主要用来做多媒体录音和录视频的
首先是录制视频的mainActivity.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/surfaceview"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="暂停"
android:layout_weight="1"/>
<Button
android:id="@+id/start"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="开始"
android:layout_weight="1"/>
<Button
android:id="@+id/starting"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="播放"
android:onClick="btnClick"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
然后是录制视频的MainActivity类
这个类中有一个if判断这个判断是用来获取Android 6.0以上版本的动态权限
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private Button start;// 开始录制按钮
private Button stop;// 停止录制按钮
private MediaRecorder mediarecorder;// 录制视频的类
private SurfaceView surfaceview;// 显示视频的控件
private SurfaceHolder surfaceHolder;
private int REQUEST_TAKE_PHOTO_PERMISSION = 1;
private String FileName = "/sdcard/love.3gp";
private Camera camera;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
// 选择支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.activity_main);
//这个if判断是用来加Android6.0以上版本的动态权限
if (CommonUtil.isCameraCanUse()) {
init();
} else {
// Toast.makeText(getActivity(),"请打开此应用的摄像头权限!",Toast.LENGTH_SHORT).show();
//申请权限, REQUEST_TAKE_PHOTO_PERMISSION是自定义的常量
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
REQUEST_TAKE_PHOTO_PERMISSION);
}
}
private void init() {
start = (Button) this.findViewById(R.id.start);
stop = (Button) this.findViewById(R.id.stop);
start.setOnClickListener(listener);
stop.setOnClickListener(listener);
surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
SurfaceHolder holder = surfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回调接口
// setType必须设置,要不出错.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void btnClick(View view){
Intent intent = new Intent(this,Main2Activity.class);
intent.putExtra("fileName",FileName);
startActivity(intent);
}
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v == start) {
mediarecorder = new MediaRecorder();// 创建mediarecorder对象
// 设置录制视频源为Camera(相机)
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
if (camera!=null){
//必须加这行代码否则,录制视频时会横屏
camera.setDisplayOrientation(90);
camera.unlock();
mediarecorder.setCamera(camera);
}
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mediarecorder
.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置录制的视频编码h263 h264
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置录制时,录制声音
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoSize(640, 480);
mediarecorder.setVideoEncodingBitRate(5*1024*1024);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoFrameRate(20);
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
// 设置视频文件输出的路径
//这行代码是为了让你在,浏览视频时为竖屏,不设置这行代码视频进行播放时会横屏会很丑
mediarecorder.setOrientationHint(90);
mediarecorder.setOutputFile(FileName);
Log.e("MainActivity", "未开始录制");
try {
// 准备录制
mediarecorder.prepare();
Log.e("MainActivity", "准备录制");
// 开始录制
mediarecorder.start();
Log.e("MainActivity", "开始录制");
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (v == stop) {
if (mediarecorder != null) {
// 停止录制
mediarecorder.stop();
// 释放资源
mediarecorder.release();
mediarecorder = null;
}
}
}
};
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
public void surfaceCreated(SurfaceHolder holder) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
public void surfaceDestroyed(SurfaceHolder holder) {
// surfaceDestroyed的时候同时对象设置为null
surfaceview = null;
surfaceHolder = null;
mediarecorder = null;
}
}
播放视频时使用的Main2Activity.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/start"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="开始"
android:onClick="btnClick"/>
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="暂停"
android:onClick="btnClick"/>
<Button
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="返回"
android:onClick="btnClick"/>
</LinearLayout>
</LinearLayout>
播放视频时的Main2Activity类
public class Main2Activity extends AppCompatActivity {
private VideoView mView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
init();
}
private void init() {
Intent intent = getIntent();
String fileName = intent.getStringExtra("fileName");
mView = (VideoView) findViewById(R.id.videoView);
//设置视频控制器
mView.setMediaController(new MediaController(this));
mView.setVideoPath(fileName);
mView.requestFocus();
}
public void btnClick(View view){
switch (view.getId()){
case R.id.start:
mView.start();
break;
case R.id.stop:
mView.pause();
break;
case R.id.cancel:
finish();
break;
}
}
}
这个是MainActivity类中if判断中使用的工具类CommonUtil
import android.hardware.Camera;
/**
* @className: CommonUtil
* @classDescription: 通用工具类
* @author: miao
* @createTime: 2017年2月10日
*/
public class CommonUtil {
public static boolean isCameraCanUse() {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
} catch (Exception e) {
canUse = false;
}
if (canUse) {
if (mCamera != null)
mCamera.release();
mCamera = null;
}
return canUse;
}
}
把这个类加到app中,这个类主要应用于Android 6.0以上的动态权限