2016-04-07 31 views
0

2 api -Android Kamera olarak siyah görüntüleri kaydetmek ama Camera 2 api sonra ben image.i yakalamaGörüntüler Ben custome kamera geliştiriyorum

için kodunun altına kullanıyorum siyah alıyorum kullanarak bir görüntü yakalamak için çalışırken

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
     try { 
      String cameraId = ""; 
      if (cameraFront) { 
       cameraId = "" + findFrontFacingCamera(); 
      } else { 
       cameraId = "" + findBackFacingCamera(); 
      } 

      CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 
      // CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraDevice.getId()); 

      Size[] jpegSizes = null; 
      if (characteristics != null) { 
       jpegSizes = 
         characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(
           ImageFormat.JPEG); 
      } 
      int width = 720; 
      int height = 640; 
      if (jpegSizes != null && 0 < jpegSizes.length) { 
       width = jpegSizes[0].getWidth(); 
       height = jpegSizes[0].getHeight(); 
      } 
      StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
      Size largest = 
        Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizesByArea()); 
      ImageReader reader = 
        ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /* maxImages */1); 
      // ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
      List<Surface> outputSurfaces = new ArrayList<Surface>(2); 
      outputSurfaces.add(reader.getSurface()); 
      outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture())); 

      final CaptureRequest.Builder captureBuilder = 
        mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
      captureBuilder.addTarget(reader.getSurface()); 
      captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); 

      captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
      captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 

      // Orientation 
      int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
      if (cameraFront) { 
       captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation) + 180); 

      } else { 
       captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 
      } 
      final File file = getOutputMediaFile(); 

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

       private void save(byte[] bytes) throws IOException 
       { 
        OutputStream output = null; 
        try { 
         output = new FileOutputStream(file); 
         output.write(bytes); 

        } finally { 
         if (null != output) { 
          output.close(); 
         } 
        } 
       } 

      }; 

      HandlerThread thread = new HandlerThread("CameraPicture"); 
      thread.start(); 
      final Handler backgroudHandler = new Handler(thread.getLooper()); 
      reader.setOnImageAvailableListener(readerListener, backgroudHandler); 

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


and below are the methods for camera preview 

protected void startPreview() { try {

  if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) { 
       Log.e(TAG, "startPreview fail, return"); 
       return; 
      } 

      SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
      if (null == texture) { 
       Log.e(TAG, "texture is null, return"); 
       return; 
      } 
      Log.e(TAG, "Width: " + mPreviewSize.getWidth() + " Hieght : " + mPreviewSize.getHeight()); 
      texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
      Surface surface = new Surface(texture); 

      try { 
       mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
       mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 

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

      mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() 
      { 

       @Override 
       public void onConfigured(CameraCaptureSession session) 
       { 

        mPreviewSession = session; 
        updatePreview(); 
       } 

       @Override 
       public void onConfigureFailed(CameraCaptureSession session) 
       { 

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

    protected void updatePreview() 
    { 
     try { 
      if (null == mCameraDevice) { 
       Log.e(TAG, "updatePreview error, return"); 
      } 

      mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); 
      // mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
      // Flash is automatically enabled when necessary. 
      mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 

      HandlerThread thread = new HandlerThread("CameraPreview"); 
      thread.start(); 
      Handler backgroundHandler = new Handler(thread.getLooper()); 

      mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler); 
     } catch (CameraAccessException e) { 
      } 

onun tüm cihazlarda çalışma ama sonra LogCat içinde uyarı altında olan

I/Koreograf siyah görüntüyü elde Micromax Q382 cihazda runnig am zaman: Atlanan 37 kare! Uygulama ana iş parçacığı üzerinde çok fazla iş yapıyor olabilir. W/ImageReader_JNI: Bir lockedBuffer alınamıyor, çok büyük olasılıkla istemci maxImages tamponları

ben Yardım et happening.Please şey bu bir fikrin almıyorum daha kilitlemek için çalışır.

+0

Kamera önizleme ile kamera yakalama arasında küçük bir gecikme ile deneyin. Ayrıca varsayılan kamera ile sorun cihazında bir fotoğraf çekmeyi denediniz mi.Fotoğraf makinesi düzgün çalışıyor mu? –

+0

Cevabınız için teşekkürler @Sunil Evet, varsayılan kamera ile çalışıp çalışmadığını kontrol ettim.Ayrıca tüm cihazlarda çalışmasına rağmen micromax Q382 cihazında çalıştırmaya çalışırken siyah görüntüyü yakalamaya çalışıyor Görüntü –

+0

http://stackoverflow.com/questions/9417608/android-camera-on-tamamen-siyah-fotoğraf-fotoğraf-tamamen-siyah –

cevap

0

Yakalama işlemine başlamadan önce (ve kamerayı açtıktan sonra) bir miktar gecikme ayarlamayı deneyebilirsiniz. İsterseniz

new Handler().postDelayed(() -> { 
    //takePicture(); 
}, 500); 

, ben kitlesel Android Kamera 2 API ile fotoğraflarını çekmeye kolaylaştıran bir hizmet oluşturduk: Böyle bir şey https://github.com/hzitoun/android-camera2-secret-picture-taker. Benioku dosyasında kullanım açıklanmaktadır.

Yardım budur!

0

AE modunu 'her zaman yanıp sönecek' olarak ayarlıyorsunuz, ancak kamera aygıtının bu flaş için ölçüm yapmasını sağlamak üzere ön ayırma dizisini çalıştırmıyorsunuz; Bu muhtemelen herhangi bir cihazda çok iyi çalışmayacaktır ve bazı cihazlarda bazı varsayılan pozlama değeri (kötü) ile sonuçlanabilir. Flaş kovmak istiyorsanız

, olmayan ESKİ cihazlarda, (daha sonra yakalama isteği, sonuna kadar PRECAPTURE AE_STATE bekleyin AE_PRECAPTURE_TRIGGER seti ile tek isteği göndermek) ilk olarak bir precapture dizisini kullanmak gerekir. Cihaz LEGACY düzeyinde ise, o zaman geçerli kodunuz bunlar için uygun olmalıdır.

0

startPreview'un içinde createCaptureSession için null argümanını geçiyorsunuz. Daha önce bu yönteme görülebilir olan backgroudHandler'u yapın (parametre olarak geçirin veya bir sınıf değişkeni olarak başlangıç ​​durumuna getirin) ve orada da kullanın.