Java Android摄像头捕获请求和多个目标曲面存在问题
我正在尝试将相同的摄影机提要输出到2个SurfaceTexture。如果我只针对其中一个表面,应用程序运行良好(当然,只有一个显示摄像头提要)。如果我把两者都瞄准,它会在摄像机停止前工作很短的一段时间。当它冻结时,将调用onCaptureFailed方法(包含在CameraCaptureSession.CaptureCallback中)。 我使用的是运行安卓5.1的Nexus5。 这是我的密码:Java Android摄像头捕获请求和多个目标曲面存在问题,java,android,android-camera,android-5.0-lollipop,Java,Android,Android Camera,Android 5.0 Lollipop,我正在尝试将相同的摄影机提要输出到2个SurfaceTexture。如果我只针对其中一个表面,应用程序运行良好(当然,只有一个显示摄像头提要)。如果我把两者都瞄准,它会在摄像机停止前工作很短的一段时间。当它冻结时,将调用onCaptureFailed方法(包含在CameraCaptureSession.CaptureCallback中)。 我使用的是运行安卓5.1的Nexus5。 这是我的密码: package com.jackdelano.capstone2; import android.
package com.jackdelano.capstone2;
import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Range;
import android.util.Size;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.hardware.camera2.CameraDevice;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class CameraActivity extends Activity {
HandlerThread myHandlerThread;
Handler myHandler;
CameraManager myCameraManager;
String myCameraId; //either 0 or 1 I think
CameraDevice myCameraDevice;
TextureView myTextureView1;
TextureView myTextureView2;
List<Surface> mySurfaceList;
CameraCharacteristics myCameraCharacteristics;
CaptureRequest.Builder myBuilder;
Surface mySurface1;
Surface mySurface2;
boolean surfaceTexture1Available;
boolean surfaceTexture2Available;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
myCameraId = "0";
surfaceTexture1Available = false;
surfaceTexture2Available = false;
myTextureView1 = (TextureView) findViewById(R.id.myTextureView1);
myTextureView2 = (TextureView) findViewById(R.id.myTextureView2);
myTextureView1.setSurfaceTextureListener(mySurfaceTexture1Listener);
myTextureView2.setSurfaceTextureListener(mySurfaceTexture2Listener);
myHandlerThread = new HandlerThread("Camera");
myHandlerThread.start();
myHandler = new Handler(myHandlerThread.getLooper());
myCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
}
void startPreview()
{
SurfaceTexture mySurfaceTexture1 = myTextureView1.getSurfaceTexture();
SurfaceTexture mySurfaceTexture2 = myTextureView2.getSurfaceTexture();
try {
myCameraCharacteristics = myCameraManager.getCameraCharacteristics(myCameraId);
}catch(CameraAccessException e) {
e.printStackTrace();
}
StreamConfigurationMap configs = myCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size dimensions1 = configs.getOutputSizes(mySurfaceTexture1.getClass())[0];
mySurfaceTexture1.setDefaultBufferSize(dimensions1.getWidth(), dimensions1.getHeight());
Size dimensions2 = configs.getOutputSizes(mySurfaceTexture2.getClass())[0];
mySurfaceTexture2.setDefaultBufferSize(dimensions2.getWidth(), dimensions2.getHeight());
mySurface1 = new Surface(mySurfaceTexture1);
mySurface2 = new Surface(mySurfaceTexture2);
mySurfaceList = new ArrayList<Surface>();
mySurfaceList.add(mySurface1);
mySurfaceList.add(mySurface2);
try {
myCameraDevice.createCaptureSession(mySurfaceList, myCameraCaptureSessionStateCallback, myHandler);
}catch(CameraAccessException e){
e.printStackTrace();
}
}
TextureView.SurfaceTextureListener mySurfaceTexture1Listener = new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(SurfaceTexture _surfaceTexture, int width, int height) {
surfaceTexture1Available = true;
if(surfaceTexture2Available) {
try {
myCameraManager.openCamera(myCameraId, myCameraDeviceStateCallback, myHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture _surfaceTexture) {
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture _surfaceTexture, int width, int height) {
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture _surfaceTexture) {
}
};
TextureView.SurfaceTextureListener mySurfaceTexture2Listener = new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(SurfaceTexture _surfaceTexture, int width, int height) {
surfaceTexture2Available = true;
if(surfaceTexture1Available) {
try {
myCameraManager.openCamera(myCameraId, myCameraDeviceStateCallback, myHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture _surfaceTexture) {
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture _surfaceTexture, int width, int height) {
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture _surfaceTexture) {
}
};
private CameraDevice.StateCallback myCameraDeviceStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice _cameraDevice) {
myCameraDevice = _cameraDevice;
startPreview();
}
@Override
public void onDisconnected(CameraDevice _cameradevice) {
}
@Override
public void onError(CameraDevice _cameradevice, int i) {
Log.d("JUMBO", "Camera Device Error");
}
};
private CameraCaptureSession.StateCallback myCameraCaptureSessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigureFailed(CameraCaptureSession _cameraCaptureSession) {
}
public void onConfigured(CameraCaptureSession myCameraCaptureSession) {
try {
myBuilder = myCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
e.printStackTrace();
}
//THIS IS WHERE I TARGET THE SURFACES. IF ONE OF THESE LINES IS OMITTED, BEHAVIOR IS AS EXPECTED.
myBuilder.addTarget(mySurface1);
myBuilder.addTarget(mySurface2);
CaptureRequest myCaptureRequest = myBuilder.build();
try {
myCameraCaptureSession.setRepeatingRequest(myCaptureRequest, myCameraCaptureSessionCaptureCallback, myHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
};
private CameraCaptureSession.CaptureCallback myCameraCaptureSessionCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
Log.d("JUMBO", "capture failed" + Integer.toString(failure.getReason()));
}
};
void toast(String string) {
Toast.makeText(this, string, Toast.LENGTH_LONG).show();
}
}
package com.jackdelano.capstone2;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.SurfaceTexture;
导入android.hardware.camera2.CameraAccessException;
导入android.hardware.camera2.CameraCaptureSession;
导入android.hardware.camera2.CameraCharacteristics;
导入android.hardware.camera2.CameraManager;
导入android.hardware.camera2.CaptureFailure;
导入android.hardware.camera2.CaptureRequest;
导入android.hardware.camera2.params.StreamConfigurationMap;
导入android.os.Handler;
导入android.os.HandlerThread;
导入android.support.v7.app.ActionBarActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.util.Range;
导入android.util.Size;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.Surface;
导入android.view.TextureView;
导入android.view.view;
导入android.hardware.camera2.CameraDevice;
导入android.widget.Toast;
导入java.util.ArrayList;
导入java.util.List;
公共类CameraActivity扩展了活动{
HandlerThread我的HandlerThread;
Handler myHandler;
CameraManager myCameraManager;
字符串myCameraId;//我认为是0还是1
我的相机设备;
纹理视图MyTextureView W1;
纹理视图MyTextureView 2;
列表mySurfaceList;
摄影特征我的摄影特征;
CaptureRequest.Builder-myBuilder;
表面mySurface1;
表面mySurface2;
布尔surfaceTexture1Available;
布尔surfaceTexture2Available;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_摄像头);
View decorView=getWindow().getDecorView();
int uiOptions=View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_全屏| View.SYSTEM_UI_FLAG_沉浸式|;
decorView.设置系统兼容性(uiOptions);
myCameraId=“0”;
surfaceTexture1Available=假;
surfaceTexture2Available=假;
MyTextureView=(TextureView)findViewById(R.id.MyTextureView);
myTextureView2=(TextureView)findViewById(R.id.myTextureView2);
myTextureView1.setSurfaceTextureListener(mySurfaceTexture1Listener);
myTextureView2.setSurfaceTextureListener(mySurfaceTexture2Listener);
myHandlerThread=新HandlerThread(“摄像头”);
myHandlerThread.start();
myHandler=新处理程序(myHandlerThread.getLooper());
myCameraManager=(CameraManager)this.getSystemService(Context.CAMERA_服务);
}
void startPreview()
{
SurfaceTexture mySurfaceTexture1=myTextureView1.getSurfaceTexture();
SurfaceTexture mySurfaceTexture2=myTextureView2.getSurfaceTexture();
试一试{
myCameraCharacteristics=myCameraManager.getCameraCharacteristics(myCameraId);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
StreamConfigurationMap configs=myCameraCharacteristics.get(CameraCharacteristics.SCALER\u STREAM\u CONFIGURATION\u MAP);
Size dimensions1=configs.getOutputSizes(mySurfaceTexture1.getClass())[0];
mySurfaceTexture1.setDefaultBufferSize(维度s1.getWidth(),维度s1.getHeight());
Size dimensions2=configs.getOutputSizes(mySurfaceTexture2.getClass())[0];
mySurfaceTexture2.setDefaultBufferSize(dimensions2.getWidth(),dimensions2.getHeight());
mySurface1=新曲面(mySurfaceTexture1);
mySurface2=新曲面(mySurfaceTexture2);
mySurfaceList=newarraylist();
添加(mySurface1);
添加(mySurface2);
试一试{
myCameradDevice.createCaptureSession(mySurfaceList、myCameraCaptureSessionStateCallback、myHandler);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
TextureView.SurfaceTextRelistener mySurfaceTexture1Listener=新建TextureView.SurfaceTextRelistener(){
@凌驾
SurfaceTexture上的公共空心可用(SurfaceTexture\u SurfaceTexture,int-width,int-height){
SurfaceTexture1可用=真;
如果(表面结构2可用){
试一试{
openCamera(myCameraRAID、myCameraDeviceStateCallback、myHandler);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
}
@凌驾
公共布尔onSurfaceTextureDestroyed(SurfaceTexture\u SurfaceTexture){
返回true;
}
@凌驾
SurfaceTextureSizeChanged上的公共空隙(SurfaceTexture _SurfaceTexture,int-width,int-height){
}
@凌驾
更新了SurfaceTexture上的公共空间(SurfaceTexture\u SurfaceTexture){
}
};
TextureView.SurfaceTextRelister mySurfaceTexture2Listener=新建TextureView.SurfaceTextRelister(){
@凌驾
SurfaceTexture上的公共空心可用(SurfaceTexture\u SurfaceTexture,int-width,int-height){
surfaceTexture2Available=真;
如果(表面结构1可用){
试一试{
openCamera(myCameraRAID、myCameraDeviceStateCallback、myHandler);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
}
@凌驾
公共布尔OnSurfaceTextureDestructed(SurfaceTe
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jackdelano.capstone2.CameraActivity">
<TextureView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myTextureView1"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp" />
<TextureView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myTextureView2"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp"/>