2016-04-05 10 views
6

Tôi đang sử dụng camera2 api để chụp ảnh và hiển thị trong thumnail. Mọi thứ đang hoạt động tốt trên mọi thiết bị nhưng khi sử dụng thiết bị Micromax Q382 hiển thị image.I đen của nó đang nhận được dưới đây Issuelỗi: Không thể lấy khóa bị khóa, rất có khả năng khách hàng sẽ cố gắng khóa nhiều hơn các bộ đệm tối đa

Unable to acquire a lockedBuffer, very likely client tries to lock more than maxImages buffers 

tôi đang sử dụng bên dưới mã cho chụp listerner callback

final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() 
     { 

      @Override 
      public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, 
              TotalCaptureResult result) 
      { 

       super.onCaptureCompleted(session, request, result); 

       startPreview(); 
      } 

     }; 

     mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() 
     { 

      @Override 
      public void onConfigured(CameraCaptureSession session) 
      { 

       try { 
        session.capture(captureBuilder.build(), captureListener, backgroudHandler); 
       } catch (CameraAccessException e) { 
        AppLogger.exception(myContext, getClass().getSimpleName(), e); 
        // e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onConfigureFailed(CameraCaptureSession session) 
      { 

      } 
     }, backgroudHandler); 

    } catch (CameraAccessException e) { 
     AppLogger.exception(myContext, getClass().getSimpleName(), e); 
     // e.printStackTrace(); 
    } 

và dưới mã sử dụng cho OnImageAvailableListener

ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() 
     { 

      @Override 
      public void onImageAvailable(ImageReader reader) 
      { 

       Image image = null; 
       try { 
        image = reader.acquireLatestImage(); 
        // ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
        // final byte[] bytes = new byte[buffer.capacity()]; 

        ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
        final byte[] bytes = new byte[buffer.remaining()]; 

        buffer.get(bytes); 
        save(bytes); 
        buffer.clear(); 
        runOnUiThread(new Runnable() 
        { 

         @Override 
         public void run() 
         { 
          mThumbnail.setVisibility(View.VISIBLE); 
          filePathLabel.setVisibility(View.VISIBLE); 
          filePathValue.setText(file.getAbsolutePath()); 

          Bitmap bmp = 
            UtilityMethods.getScaledBitmap(CameraImageTestActivityLoliipop.this, bytes); 
          mThumbnail.setImageBitmap(bmp); 
         } 
        }); 

       } catch (FileNotFoundException e) { 
        AppLogger.exception(myContext, getClass().getSimpleName(), e); 
        // e.printStackTrace(); 
       } catch (IOException e) { 
        AppLogger.exception(myContext, getClass().getSimpleName(), e); 
        // e.printStackTrace(); 
       } finally { 
        if (image != null) { 
         image.close(); 
        } 
       } 
      } 
+0

Vui lòng cung cấp dữ liệu ghi nhận từ trước khi lỗi là tốt, và cả ngoại trừ vết đống, để xem lỗi ở đâu đã được tạo ra và trong hoàn cảnh nào. –

+0

Nó không ném bất kỳ ngoại lệ, nhưng tôi tìm thấy một cái gì đó khi tôi đang chụp hình sau đó xem trước máy ảnh chuyển động cuối cùng cho một thứ hai được màu đen nó có nghĩa là hình ảnh mà tôi đang chụp là màu đen. Tôi nghĩ rằng đây sẽ là vấn đề. Nhưng tôi đã cố gắng để thay đổi tài sản nhưng did't nhận được bất kỳ giải pháp nào được nêu ra ... –

+0

Bạn đã bao giờ giải quyết vấn đề này? –

Trả lời

6

Bạn có thể cung cấp thông số maxImages làm 1 cho phương thức ImageReader.newInstance. acquireLatestImage gọi acquireNextSurfaceImage trước khi đóng bộ đệm hình ảnh duy nhất, dẫn đến cảnh báo này.

Sử dụng acquireNextImage trong trường hợp này. Nếu maxImages lớn hơn 1, acquireLatestImage không có vấn đề này.

1

Sau khi đặt tối đa thành 2 và sử dụng obtainLatestImage, nếu bạn vẫn gặp phải vấn đề mà bạn đã ngừng nhận cuộc gọi trênImageAvailable thì rất có thể bạn không phát hành bộ đệm hình ảnh mà bạn nhận được từ phương thức obtainLatestImage(), bộ đệm sẽ không khả dụng trừ khi bạn gọi Image.close() trên hình ảnh đó và cho phép cùng một bộ đệm để tái sử dụng.

Image raw = imageReader.acquireLatestImage(); 
    raw.close(); 

Dưới đây là liên kết cho các tài liệu: https://developer.android.com/reference/android/media/Image.html#close()

Các vấn đề liên quan