本文实例为大家讲解如何轻松实现Android手机拍照和录像功能,分享给大家供大家参考。具体如下:
要实现录像和拍照的功能,首先我们在 manifest 里添加权限,以免后面忘记添加
<!-- 调用摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 录制视频/音频权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- sd卡读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 挂载sd卡 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
一个简单的页面布局photo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
>
<SurfaceView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/sv_main_surface"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="takePhoto"
android:text="拍照"
/>
</LinearLayout>
Video2Activity.java
package com.pxd.mediaplayer;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by Administrator on 2017/2/14.
*/
public class Video2Activity extends AppCompatActivity {
private SurfaceView sv_main_surface;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photo);
sv_main_surface = (SurfaceView) findViewById(R.id.sv_main_surface);
sv_main_surface.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
//打开照相机
camera = Camera.open();
//设置参数
Camera.Parameters parameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("jpeg-quality",85);
camera.setParameters(parameters);
//将画面展示到SurfaceView
try {
camera.setPreviewDisplay(sv_main_surface.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
//开启预览效果
camera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
camera.stopPreview();
camera.release();
camera=null;
}
}
});
}
public void takePhoto(View view){
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//技术:
Bitmap bitmap= BitmapFactory.decodeByteArray(data,0,data.length);
try {
FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/images/"+System.currentTimeMillis()+".png");
bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);
Toast.makeText(Video2Activity.this, "拍摄成功", Toast.LENGTH_SHORT).show();
camera.stopPreview();
camera.startPreview();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
}
以上代码实现的是拍照的功能。
实现录像功能思路
*Android实现录像主要依靠MediaRecorder和SurfaceView这两个类。另外,因为需要对摄像头参数做一些设定,所以也需要Camera类。它们的作用分别是:MediaRecorder通过控制录像音视频源和输出编码等;surfaceview则是作为View的存在提供用户界面,在surfaceview的不同生命周期实现不同的操作;camera类则用于对摄像头参数做一些设定,再调用MediaRecorder的setCamera()
方法将camera对象带入。
在这里给出自己的一个测试demo:
布局videoxml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sv_recorder_surface"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"
android:onClick="start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"
android:onClick="stop"
/>
</LinearLayout>
</RelativeLayout>
MediaRecoderActivity.java
package com.pxd.mediaplayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
/**
* Created by Administrator on 2017/2/15.
*/
public class MediaRecorderActivity extends AppCompatActivity {
private SurfaceView sv_recorder_surface;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video);
sv_recorder_surface = (SurfaceView) findViewById(R.id.sv_recorder_surface);
//实例化媒体录制器
mediaRecorder = new MediaRecorder();
}
public void start(View view) {
mediaRecorder.reset();
//从照相机采集视频
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置保存路径
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/"+System.currentTimeMillis()+".mp4");
mediaRecorder.setPreviewDisplay(sv_recorder_surface.getHolder().getSurface());
try {
//预期准备
mediaRecorder.prepare();
//开始刻录
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop(View view) {
if(mediaRecorder!=null){
mediaRecorder.stop();
//停止刻录
mediaRecorder.release();
Toast.makeText(this, "录制成功", Toast.LENGTH_SHORT).show();
mediaRecorder=null;
}
}
}