思路:利用Camera和SurfaceHolder
步骤
**
**
利用SurfaceView进行相机预览
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sv_camera"/>
在Activity中初始化控件,注意与SurfaceView一起使用的还有SurfaceHolder
private void initViews(){//初始化控件
mSurfaceView=findViewById(R.id.sv_camera);
mSurfaceHoder=mSurfaceView.getHolder();
mSurfaceHoder.addCallback(this);//添加回调接口,这一句很重要,一定要添加
}
**
**
需要注意的是,摄像头有2个,前置摄像头和后置摄像头。
不同的机型,对应的摄像头ID可能不一样,以我的为例。
private Camera mCamera;
private final int CAMERA_FRONT=1;//前置摄像头
private final int CAMERA_BEHIND=0;//后置摄像头
**
**
public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback
实现这个接口的方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
//SurfaceView创建时调用
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//SurfaceView发生改变时调用
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//SurfaceView销毁时调用
}
4.初始化摄像头
使用Camera.open()方法打开摄像头
Camera camera;
camera=Camera.open(CAMERA_NOW);//默认打开后置摄像头
mCamera.setDisplayOrientation(90);//安卓默认是横屏,旋转转为90度,转为竖屏
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
还要写释放Camera的方法,这个最好写,不然可能其它程序调用的时候容易被占用
public void releaseCamera(){
mCamera.stopPreview();
if(mCamera==null){
return;
}
mCamera.release();
mCamera=null;
mSurfaceHoder=null;
}
完整的代码:
package com.magic.myfacecamera;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private static final String TAG="CameraActivity";
private Camera mCamera;
private final int CAMERA_FRONT=1;//前置摄像头
private final int CAMERA_BEHIND=0;//后置摄像头
private int CAMERA_NOW=CAMERA_BEHIND;//默认打开后置摄像头
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHoder;
/////////////////////////////创建时/////////////////////////////////
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
initViews();
}
private void initViews(){//初始化控件
mSurfaceView=findViewById(R.id.sv_camera);
mSurfaceHoder=mSurfaceView.getHolder();
mSurfaceHoder.addCallback(this);//添加回调接口
}
public Camera getCamera(){//初始化摄像头
Camera camera;
try {
camera=Camera.open(CAMERA_NOW);//默认打开后置摄像头
return camera;
}catch (Exception e){
Log.i(TAG,"open camera failed");
e.printStackTrace();
}
return null;
}
public void startPreview(Camera camera,SurfaceHolder surfaceHolder){
if(camera==null){
mCamera=getCamera();
}else{
mCamera=camera;
}
if(surfaceHolder==null){
surfaceHolder=mSurfaceView.getHolder();
}
try {
mCamera.setDisplayOrientation(90);//安卓默认是横屏,旋转转为90度,转为竖屏
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//创建时开始预览
startPreview(mCamera,mSurfaceHoder);
}
//////////////////////////////改变时/////////////////////////////////
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
////////////////////////////暂停时////////////////////////////////////
@Override
protected void onPause() {
super.onPause();
}
/////////////////////////////恢复时///////////////////////////////////
@Override
protected void onResume() {
super.onResume();
}
////////////////////////////销毁时////////////////////////////////////
public void releaseCamera(){
mCamera.stopPreview();
if(mCamera==null){
return;
}
mCamera.release();
mCamera=null;
mSurfaceHoder=null;
}
@Override
protected void onDestroy() {
releaseCamera();
super.onDestroy();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}
}