Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android摄像头捕获请求和多个目标曲面存在问题_Java_Android_Android Camera_Android 5.0 Lollipop - Fatal编程技术网

Java Android摄像头捕获请求和多个目标曲面存在问题

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.

我正在尝试将相同的摄影机提要输出到2个SurfaceTexture。如果我只针对其中一个表面,应用程序运行良好(当然,只有一个显示摄像头提要)。如果我把两者都瞄准,它会在摄像机停止前工作很短的一段时间。当它冻结时,将调用onCaptureFailed方法(包含在CameraCaptureSession.CaptureCallback中)。 我使用的是运行安卓5.1的Nexus5。 这是我的密码:

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"/>