2016-04-05 1 views
6

画像をキャプチャしてthumnailに表示するためにcamera2 apiを使用しています.デバイスを使用した場合、その黒表示image.Iは私がOnImageAvailableListenerエラー:lockedBufferを取得できません。クライアントがmaxImagesバッファを超えてロックしようとしている可能性があります。

に使用してキャプチャlisternerコールバック

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(); 
    } 

とコード下記のコードの下に使用しています問題

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

の下に取得しています

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

だけでなく、エラーの前からのログ出力を提供し、全体の例外スタックトレース、エラーが発生し、どのような状況にされている場所を確認してください。 –

+0

それは何も例外を投げていないが、私は画像をキャプチャしているときに、最後の動きでカメラのプレビューが2度目に黒くなるということを発見した。私はこれが問題だと思う。しかし、私はプロパティを変更しようとしましたが、まだ解決策がありません... –

+0

この問題を解決しましたか? –

答えて

6

ImageReader.newInstanceのパラメータmaxImages1として指定することができます。 acquireLatestImageは、この警告につながる唯一のイメージバッファを閉じる前にacquireNextSurfaceImageを呼び出します。

この場合、acquireNextImageを使用してください。 maxImages1より大きい場合、acquireLatestImageにこの問題はありません。

1

maxImagesを2に設定し、acquireLatestImageを使用しても、まだonImageAvailableコールバックの取得を停止した場所で問題が発生した場合は、acquireLatestImage()から取得したImageバッファを解放していない可能性があります。イメージ上でImage.close()を呼び出し、同じバッファを再利用できるようにします。ここで

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

は、ドキュメントへのリンクです: https://developer.android.com/reference/android/media/Image.html#close()

関連する問題