android加入摄像功能,Android调用前后摄像头同时工作

本文介绍如何在Android 6.0上使用小米4设备,实现前后摄像头同时工作。通过创建两个SurfaceView并分别设置回调,实现了双摄像头预览,并在AndroidManifest.xml中添加了必要的权限。代码示例中详细展示了SurfaceHolder.Callback的使用,以及处理摄像头方向的方法。

硬件环境:小米4

Android版本:6.0

咱们先看效果图:

8f62ce31794c

Paste_Image.png

我把代码贴出来:

AndroidMainfest.xml文件(需要新增camera权限):

activity_main.xml文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.bihu.qdemopush.MainActivity">

android:layout_width="match_parent"

android:layout_height="200dp"

android:orientation="horizontal">

android:id="@+id/surfaceview1"

android:layout_width="0dp"

android:layout_weight="1"

android:layout_height="fill_parent" />

android:id="@+id/surfaceview2"

android:layout_width="0dp"

android:layout_weight="1"

android:layout_marginLeft="5dp"

android:layout_height="fill_parent" />

MainActivity.java文件:主要是对2个surfaceView的显示渲染

public class MainActivity extends AppCompatActivity {

SurfaceView surfaceview1, surfaceview2;

SurfaceHolder surfaceholder1, surfaceholder2;

String TAG = "MainActivity";

private Camera camera1 = null, camera2;

Camera.Parameters parameters;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

surfaceview1 = (SurfaceView) findViewById(R.id.surfaceview1);

surfaceview2 = (SurfaceView) findViewById(R.id.surfaceview2);

surfaceholder1 = surfaceview1.getHolder();

surfaceholder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceholder1.addCallback(new surfaceholderCallbackBack());

surfaceholder2 = surfaceview2.getHolder();

surfaceholder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceholder2.addCallback(new surfaceholderCallbackFont());

}

@Override

protected void onDestroy() {

Log.e(TAG, "onDestroy");

super.onDestroy();

}

/**

* 后置摄像头回调

*/

class surfaceholderCallbackBack implements SurfaceHolder.Callback {

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 获取camera对象

int cameraCount = Camera.getNumberOfCameras();

if (cameraCount > 0) {

camera1 = Camera.open(0);

try {

// 设置预览监听

camera1.setPreviewDisplay(holder);

Camera.Parameters parameters = camera1.getParameters();

if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {

parameters.set("orientation", "portrait");

camera1.setDisplayOrientation(90);

parameters.setRotation(90);

} else {

parameters.set("orientation", "landscape");

camera1.setDisplayOrientation(0);

parameters.setRotation(0);

}

camera1.setParameters(parameters);

// 启动摄像头预览

camera1.startPreview();

System.out.println("camera.startpreview");

} catch (IOException e) {

e.printStackTrace();

camera1.release();

System.out.println("camera.release");

}

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

camera1.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

if (success) {

initCamera();// 实现相机的参数初始化

camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。

}

}

});

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

// 相机参数的初始化设置

private void initCamera() {

parameters = camera1.getParameters();

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦

setDispaly(parameters, camera1);

camera1.setParameters(parameters);

camera1.startPreview();

camera1.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

}

// 控制图像的正确显示方向

private void setDispaly(Camera.Parameters parameters, Camera camera) {

if (Integer.parseInt(Build.VERSION.SDK) >= 8) {

setDisplayOrientation(camera, 90);

} else {

parameters.setRotation(90);

}

}

// 实现的图像的正确显示

private void setDisplayOrientation(Camera camera, int i) {

Method downPolymorphic;

try {

downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});

if (downPolymorphic != null) {

downPolymorphic.invoke(camera, new Object[]{i});

}

} catch (Exception e) {

Log.e("Came_e", "图像出错");

}

}

}

class surfaceholderCallbackFont implements SurfaceHolder.Callback {

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 获取camera对象

int cameraCount = Camera.getNumberOfCameras();

if (cameraCount == 2) {

camera2 = Camera.open(1);

}

try {

// 设置预览监听

camera2.setPreviewDisplay(holder);

Camera.Parameters parameters = camera2.getParameters();

if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {

parameters.set("orientation", "portrait");

camera2.setDisplayOrientation(90);

parameters.setRotation(90);

} else {

parameters.set("orientation", "landscape");

camera2.setDisplayOrientation(0);

parameters.setRotation(0);

}

camera2.setParameters(parameters);

// 启动摄像头预览

camera2.startPreview();

System.out.println("camera.startpreview");

} catch (IOException e) {

e.printStackTrace();

camera2.release();

System.out.println("camera.release");

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

camera2.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

if (success) {

parameters = camera2.getParameters();

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦

setDispaly(parameters, camera2);

camera2.setParameters(parameters);

camera2.startPreview();

camera2.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。

}

}

});

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

// 控制图像的正确显示方向

private void setDispaly(Camera.Parameters parameters, Camera camera) {

if (Integer.parseInt(Build.VERSION.SDK) >= 8) {

setDisplayOrientation(camera, 90);

} else {

parameters.setRotation(90);

}

}

// 实现的图像的正确显示

private void setDisplayOrientation(Camera camera, int i) {

Method downPolymorphic;

try {

downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});

if (downPolymorphic != null) {

downPolymorphic.invoke(camera, new Object[]{i});

}

} catch (Exception e) {

Log.e("Came_e", "图像出错");

}

}

}

}

可能出现的问题:

1、没有权限,需要手动打开,代码里由于追求简便,没有主动申请,只在mainfest中注册了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值