摄像机之间的Android摄像头preVIEW开关 [英] Android Camera Preview Switch between cameras
问题描述
大家好,我试图同时显示相机preVIEW设备的正面和背面摄像头之间切换。我下面的示例通过普通洁具提供。下面是我使用的code,每当我点击翻转按钮的表面观变黑,我不知道我错了。请帮我解决这个问题。我搜索关于这一点,我没有得到任何合适的答案为一些试图重新启动当前活动,但我不想这样。希望能得到更好的响应。在此先感谢。
包com.commonsware.android.camera;
进口android.app.Activity;
进口android.hardware.Camera;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口android.widget.CompoundButton;
进口android.widget.CompoundButton.OnCheckedChangeListener;
进口android.widget.Toast;
进口android.widget.ToggleButton;
公共类previewDemo延伸活动{
私人SurfaceView preVIEW = NULL;
私人SurfaceHolder previewHolder = NULL;
私人相机拍照= NULL;
私人布尔在preVIEW = FALSE;
私人布尔cameraConfigured = FALSE;
私人切换按钮flipCamera;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
flipCamera =(切换按钮)findViewById(R.id.flip);
preVIEW =(SurfaceView)findViewById(R.id. preVIEW);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
flipCamera.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,
布尔器isChecked){
// TODO自动生成方法存根
重新启动preVIEW(器isChecked);
}
});
}
@覆盖
公共无效onResume(){
super.onResume();
//相机= Camera.open();
INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
如果(Camera.getNumberOfCameras()大于1
&功放;&安培; CAMID< Camera.getNumberOfCameras() - 1){
// startCamera(CAMID + 1);
相机= Camera.open(CAMID + 1);
} 其他 {
// startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
摄像头= Camera.open(CAMID);
}
启动preVIEW();
}
无效重启preVIEW(布尔isFront){
如果(在preVIEW){
camera.stop preVIEW();
}
//
camera.release();
//摄像头= NULL;
//在preVIEW = FALSE;
// / * INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
//如果(Camera.getNumberOfCameras()→1&安培;&安培; CAMID&其中;
// Camera.getNumberOfCameras() - 1){
// // startCamera(CAMID + 1);
//相机= Camera.open(CAMID + 1);
// } 其他 {
// //startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
//摄像头= Camera.open(CAMID);
//} * /
INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
如果(isFront){
摄像头= Camera.open(CAMID);
camera.start preVIEW();
} 其他 {
相机= Camera.open(CAMID + 1);
camera.start preVIEW();
}
//启动preVIEW();
}
@覆盖
公共无效的onPause(){
如果(在preVIEW){
camera.stop preVIEW();
}
camera.release();
摄像头= NULL;
在preVIEW = FALSE;
super.onPause();
}
私人Camera.Size getBest previewSize(INT宽度,高度INT,
Camera.Parameters参数){
Camera.Size结果= NULL;
对于(Camera.Size大小:parameters.getSupported previewSizes()){
如果(size.width< =宽度放大器;&安培; size.height< =身高){
如果(结果== NULL){
结果=大小;
} 其他 {
INT resultArea = result.width * result.height;
INT newArea = size.width * size.height;
如果(newArea> resultArea){
结果=大小;
}
}
}
}
返回(结果);
}
私人无效的init preVIEW(INT宽度,高度INT){
如果(相机= NULL和放大器;!&安培;!previewHolder.getSurface()= NULL){
尝试 {
camera.set previewDisplay(previewHolder);
}赶上(的Throwable T){
Log.e(previewDemo-surfaceCallback
异常的一套previewDisplay(),T);
Toast.makeText(previewDemo.this,t.getMessage()
Toast.LENGTH_LONG).show();
}
如果(!cameraConfigured){
Camera.Parameters参数= camera.getParameters();
Camera.Size大小= getBest previewSize(宽度,高度,参数);
如果(大小!= NULL){
parameters.set previewSize(size.width,size.height);
camera.setParameters(参数);
cameraConfigured = TRUE;
}
}
}
}
私人无效开始preVIEW(){
如果(cameraConfigured&安培;&安培;!摄像头= NULL){
camera.start preVIEW();
在preVIEW = TRUE;
}
}
SurfaceHolder.Callback surfaceCallback =新SurfaceHolder.Callback(){
公共无效surfaceCreated(SurfaceHolder持有者){
//空操作 - 等到surfaceChanged()
}
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
INT高度){
初始化preVIEW(宽,高);
启动preVIEW();
}
公共无效surfaceDestroyed(SurfaceHolder持有者){
//空操作
如果(相机!= NULL){
/ *
*叫停preVIEW()停止更新preVIEW表面。
* /
camera.stop preVIEW();
/ *
*重要:呼叫释放()所发布使用相机
*其他的应用程序。应用程序应该释放相机
*立即的onPause()(并重新打开(),它在onResume())。
* /
camera.release();
摄像头= NULL;
}
}
};
}
您似乎忘了叫设置previewDisplay()
(或者,在你的情况下, ,的init preVIEW()
)之前调用启动preVIEW()
从重启previev()
方法。实际上,你试图启动preVIEW而不指定表面呈现preVIEW成。
Hi guys i am trying to switch between the device's Front and Back Camera while showing the camera preview. I am following the sample provide by common ware. Below is the code which i am using and whenever i click on the Flip button the surface view goes black and i don't know where i am going wrong. Please help me to solve this issue. I searched about this and i didn't get any suitable answers as some have tried to restart the current activity but i dont want like that. Hoping for better response. Thanks in Advance.
package com.commonsware.android.camera;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public class PreviewDemo extends Activity {
private SurfaceView preview = null;
private SurfaceHolder previewHolder = null;
private Camera camera = null;
private boolean inPreview = false;
private boolean cameraConfigured = false;
private ToggleButton flipCamera;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
flipCamera = (ToggleButton) findViewById(R.id.flip);
preview = (SurfaceView) findViewById(R.id.preview);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
flipCamera.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
restartPreview(isChecked);
}
});
}
@Override
public void onResume() {
super.onResume();
// camera=Camera.open();
int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
if (Camera.getNumberOfCameras() > 1
&& camId < Camera.getNumberOfCameras() - 1) {
// startCamera(camId + 1);
camera = Camera.open(camId + 1);
} else {
// startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
camera = Camera.open(camId);
}
startPreview();
}
void restartPreview(boolean isFront) {
if (inPreview) {
camera.stopPreview();
}
//
camera.release();
// camera=null;
// inPreview=false;
// /*int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
// if (Camera.getNumberOfCameras() > 1 && camId <
// Camera.getNumberOfCameras() - 1) {
// //startCamera(camId + 1);
// camera = Camera.open(camId + 1);
// } else {
// //startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
// camera = Camera.open(camId);
// }*/
int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
if (isFront) {
camera = Camera.open(camId);
camera.startPreview();
} else {
camera = Camera.open(camId + 1);
camera.startPreview();
}
// startPreview();
}
@Override
public void onPause() {
if (inPreview) {
camera.stopPreview();
}
camera.release();
camera = null;
inPreview = false;
super.onPause();
}
private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;
if (newArea > resultArea) {
result = size;
}
}
}
}
return (result);
}
private void initPreview(int width, int height) {
if (camera != null && previewHolder.getSurface() != null) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(PreviewDemo.this, t.getMessage(),
Toast.LENGTH_LONG).show();
}
if (!cameraConfigured) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = getBestPreviewSize(width, height, parameters);
if (size != null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
cameraConfigured = true;
}
}
}
}
private void startPreview() {
if (cameraConfigured && camera != null) {
camera.startPreview();
inPreview = true;
}
}
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
initPreview(width, height);
startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
if (camera != null) {
/*
* Call stopPreview() to stop updating the preview surface.
*/
camera.stopPreview();
/*
* Important: Call release() to release the camera for use by
* other applications. Applications should release the camera
* immediately in onPause() (and re-open() it in onResume()).
*/
camera.release();
camera = null;
}
}
};
}
You seem to have forgotten to call setPreviewDisplay()
(or, in your case, initPreview()
) before calling startPreview()
from your restartPreviev()
method. Effectively, you're trying to start preview without specifying a surface to render the preview into.
这篇关于摄像机之间的Android摄像头preVIEW开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!