2014-11-23 167 views
0

我有这样一段代码(只是用于试验):保存拍摄的图像

public void captureFromCam(View v) throws CameraAccessException { 
    try { 
     cm.openCamera("0", new CameraDevice.StateCallback(){ 
      @Override 
      public void onClosed(CameraDevice camera) { 
       super.onClosed(camera); 
      } 

      @Override 
      public void onError(CameraDevice camera, int error) { 

      } 

      @Override 
      public void onOpened(final CameraDevice cam) { 
       Log.d("CameraApp", "Camera Opened"); 
       ImageReader ir = ImageReader.newInstance(800, 600, 256, 1); 
       Surface surface = ir.getSurface(); 
       final ArrayList<Surface> l = new ArrayList(); 
       l.add(surface); 
       try { 
        cam.createCaptureSession(l, new CameraCaptureSession.StateCallback() { 
         @Override 
         public void onConfigured(CameraCaptureSession session) { 
          Log.e("CameraApp", "Configured"); 
          CaptureRequest.Builder builder = null, b2; 
          try { 
           builder = cam.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
          } catch (CameraAccessException e) { 
           e.printStackTrace(); 
          } 
          builder.addTarget(l.get(0)); 
          CaptureRequest request = builder.build(); 
          try { 
           session.capture(request, new CameraCaptureSession.CaptureCallback() { 
            @Override 
            public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 
             Log.e("CameraApp", "Captured"); 
            } 
           }, null); 
          } catch (CameraAccessException e) { 
           e.printStackTrace(); 
          } 
         } 

         @Override 
         public void onConfigureFailed(CameraCaptureSession session) { 

         } 
        }, null); 
       } catch (CameraAccessException e) { 
        e.printStackTrace(); 
       } 

      } 

      @Override 
      public void onDisconnected(CameraDevice camera) { 

      } 
     }, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 

} 

有趣的是onCaptureCompleted,我了解的结果是不知我的照片。

如何将此图片保存到文件?或者如果它不是我的照片,我的照片在哪里以及如何将它保存到文件?

我知道这个问题已被回答,但这是API 21,它与旧的很不同。

回答

0

我写了一个线程类来保存图片。

@Override 
public void run() { 
    mImageReader.setOnImageAvailableListener(ReaderListener, mHandler); 
} 

/** 
* diffrent formats to save diffrent pictures 
*/ 
ImageReader.OnImageAvailableListener ReaderListener = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader imageReader) { 
     Image image = imageReader.acquireLatestImage(); 
     checkParentDir(); 
     File file; 
     if (mFormat == ImageFormat.JPEG) { 
      checkJpegDir(); 
      file = createJpeg(); 
      //here,maybe null, so trycatch 
      try { 
       ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
       byte[] bytes = new byte[buffer.remaining()]; 
       buffer.get(bytes); 
       try { 
        save(bytes, file); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       image.close(); 
      } catch (Exception e) { 
       Log.i("Exception e", "ImageFormat.JPEG,,,,,,,,Exception eException e"); 
       e.getStackTrace(); 
      } 
     } else if (mFormat == ImageFormat.RAW_SENSOR) { 
      checkDngDir(); 
      file = createDng(); 
      try { 
       if (mDngCreator != null) { 
        mDngCreator.writeImage(new FileOutputStream(file), image); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       Log.i("Exception e", "mDngCreator.writeImage(new FileOutputStream(file), image)"); 
      } 
      try {//image maybe null 
       mDngCreator.close(); 
       image.close(); 
      } catch (Exception e) { 
       Log.i("Exception e", "ImageFormat.RAW_SENSOR,,,,,,,,Exception eException e"); 
       e.getStackTrace(); 
      } 

     } 
    } 
};