接收 CameraAccessException: CAMERA_ERROR (3) on CaptureSession.setRepeatingRequest()

CZY*_*ZYK 7 java hardware android android-camera2

我从 onCreate() 方法运行以下代码。这段代码之外只是回调的许多对象声明和实例化。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    thisAct = this;
    display = (TextureView)findViewById(R.id.display);
    display.setSurfaceTextureListener(surfaceTextureListener);

    db = openOrCreateDatabase("MyDatabase", Context.MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS Photos (ID INTEGER, location TEXT, size INTEGER)");
    db.execSQL("CREATE TABLE IF NOT EXISTS Tags (ID INTEGER, tag TEXT)");

    camMan = this.getSystemService(CameraManager.class);

    new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                String cm = camMan.getCameraIdList()[0];

                if ( ContextCompat.checkSelfPermission(thisAct, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ) {
                    ActivityCompat.requestPermissions((Activity)thisAct, new String[] { Manifest.permission.CAMERA }, CAMERA_REQUEST);
                }
                camMan.openCamera(cm, CDstateCallback, handle);

                while(texture == null){
                    try{
                        Thread.sleep(100);
                        Log.v("DEBUG!!!!!!!!", "Thread sleeping b/c texture is null");
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                }

//              texture.setDefaultBufferSize(325,325);
                Surface s = new Surface(texture);
                surfaceList.add(s);

                while(cameraDevice == null){
                    try{
                        Thread.sleep(100);
                        Log.v("DEBUG!!!!!!!!", "Thread sleeping b/c cameraDevice is null");
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                }

               cameraDevice.createCaptureSession(surfaceList, CCSstateCallback, handle);

               while(capSess == null){
                    try{
                        Thread.sleep(100);
                        Log.v("DEBUG!!!!!!!!", "Thread sleeping b/c capSess is null");
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                }

                capSess.prepare(surfaceList.get(0));

                capReq = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_PREVIEW);
                capReq.addTarget(surfaceList.get(0));
                capSess.setRepeatingRequest(capReq.build(), CCSlistener, handle);

            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }
    }).start();
}
Run Code Online (Sandbox Code Playgroud)

执行此行时,我在控制台中收到以下错误:

capSess.setRepeatingRequest(capReq.build(), CCSlistener, handle);
Run Code Online (Sandbox Code Playgroud)

.

android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): submitRequestList:257: Camera 0:  Got error Invalid argument (-22) after trying to set streaming request
Run Code Online (Sandbox Code Playgroud)

网上查了一下,好像是指“ERROR_CAMERA_DISABLED”这个代码,说明由于设备策略无法打开摄像头设备。

这最初让我想到直接查看权限,但如以下行所示:

if ( ContextCompat.checkSelfPermission(thisAct, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ) {
                        ActivityCompat.requestPermissions((Activity)thisAct, new String[] { Manifest.permission.CAMERA }, CAMERA_REQUEST);
                    }
Run Code Online (Sandbox Code Playgroud)

,

如果应用程序还没有权限,我会检查权限并提示用户输入权限。我还在清单文件和设备上检查了我的应用程序设置,以确认我确实拥有相机硬件权限。任何人都可以帮我解决这个问题吗?

小智 4

添加此代码来处理小于 25 的 API 为我解决了这个问题。

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
                mCaptureSession.stopRepeating();
                mCaptureSession.abortCaptures();
}
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
Run Code Online (Sandbox Code Playgroud)