2016-08-23 33 views
1

我有這些神祕的android問題之一(至少從我的角度來看)。我的應用程序通過camera2 api庫管理設備的相機。在我的情況下,我有兩個曲面,其中一個來自圖像讀取器對象。接下來我定義我的捕捉會話並將這些曲面設置爲目標。正如你可以在下面的代碼中看到的,我下面典型的工作流程在這種情況下:基於camera2的APP基於圖像讀取器表面的某些設備中的API崩潰

 // Create ImageReader Surface 
     int max = 2; 
     mReader = ImageReader.newInstance(mWidth, mHeight, ImageFormat.YV12, max); 
     ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader mReader) { 
       Image image = null; 
       image = mReader.acquireLatestImage(); 
       if (image == null) { 
        return; 
       }       

       byte[] bytes = convertYUV420ToNV21(image); 

       nativeVideoFrame(bytes); 
       image.close(); 
      } 
     }; 

     if (OPENGL_SOURCE==2){ 
      nativeVideoInit(mWidth, mHeight, 0, false); 
     } 

     mReader.setOnImageAvailableListener(readerListener, mBackgroundHandler); 

     // Create Texture Surface 
     texture = createTexture(); 
     mSurfaceTexture = new SurfaceTexture(texture); 
     mSurfaceTexture.setOnFrameAvailableListener(this); 
     mSurfaceTexture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
     mSurface = new Surface(mSurfaceTexture); 

     //Attach surfaces to CaptureRequest 
     List<Surface> outputSurfaces = new ArrayList<Surface>(2); 
     outputSurfaces.add(mReader.getSurface()); 
     outputSurfaces.add(mSurface); 
     captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     captureRequestBuilder.addTarget(mSurface); 
     captureRequestBuilder.addTarget(mReader.getSurface()); 

     //Define the capture request 
     cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback(){ 
        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         //The camera is already closed 
         if (null == cameraDevice) { 
          return; 
         } 
         // When the session is ready, we start displaying the preview. 
         cameraCaptureSessions = cameraCaptureSession; 
         updatePreview(); 
        } 
        @Override 
        public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 
         Toast.makeText(MainActivity.this, "Configuration change", Toast.LENGTH_SHORT).show(); 
        } 
       }, null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 

的事情是,我沒有跑在我的平板電腦三星TAB A.此代碼然而任何問題,當試圖在我的Nexus 5X或我的朋友的三星S6,該應用程序崩潰顯着拋出此錯誤:

08-23 11:28:51.772:E/AndroidRuntime(20315):致命例外:主 08-23 11:28: 51.772:E/AndroidRuntime(20315):進程:com.example.opengltest,PID:20315 08-23 11:28:51.772:E/AndroidRuntime(20315):java.lang.IllegalArgumentException:傳遞給攝像機服務的參數錯誤 08-23 11:28:51.772:E/AndroidRuntime(20315):在android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:114)

做一些測試,我發現問題來自圖像閱讀器表面。如果我從捕獲會話的設置中擺脫出來,代碼將無縫運行。

爲什麼這隻發生在我的Nexus 5x或三星S6上,而不是在我的平板電腦上?我該如何解決它?

感謝,

JM

回答

0

如果你看看整個系統的logcat,相機服務應該有規定,爲什麼你的輸出表面集是壞 更詳細的路線。

然而,YV12不是一種保證被支持的格式,所以它可能就是這樣。有些設備支持它,有些則不支持。

保證所有設備都支持的唯一YUV格式是ImageFormat.YUV_420_888

如果您想在可能的情況下使用YV12,則需要檢查StreamConfigurationMap.getOutputFormats()列表以查看它是否在嘗試使用之前列出。但是在許多設備上你仍然需要回到YUV_420_888,所以最簡單的方法就是直接支持,而不是其他設備。

+0

這正是你所說的。這些設備不支持YV12格式 – user3417052