2014-10-03 199 views

回答

1

結果:我實現了一個新類繼承了JavaCameraView並實現了自己的函數takePicture。

import org.opencv.android.JavaCameraView; 

import java.io.FileOutputStream; 
import java.util.List; 

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.Size; 
import android.util.AttributeSet; 
import android.util.Log; 

public class MyCameraView extends JavaCameraView implements PictureCallback { 

    private static final String TAG = "myCameraView"; 
    private String mPictureFileName; 

    public MyCameraView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public List<String> getEffectList() { 
     return mCamera.getParameters().getSupportedColorEffects(); 
    } 

    public boolean isEffectSupported() { 
     return (mCamera.getParameters().getColorEffect() != null); 
    } 

    public String getEffect() { 
     return mCamera.getParameters().getColorEffect(); 
    } 

    public void setEffect(String effect) { 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setColorEffect(effect); 
     mCamera.setParameters(params); 
    } 

    public List<Size> getResolutionList() { 
     return mCamera.getParameters().getSupportedPreviewSizes(); 
    } 

    public void setResolution(Size resolution) { 
     disconnectCamera(); 
     mMaxHeight = resolution.height; 
     mMaxWidth = resolution.width; 
     connectCamera(getWidth(), getHeight()); 
    } 

    public Size getResolution() { 
     return mCamera.getParameters().getPreviewSize(); 
    } 

    public void takePicture(final String fileName) { 
     Log.i(TAG, "Taking picture"); 
     this.mPictureFileName = fileName; 
     // Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture. 
     // Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue 
     mCamera.setPreviewCallback(null); 

     // PictureCallback is implemented by the current class 
     mCamera.takePicture(null, null, this); 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.i(TAG, "Saving a bitmap to file"); 
     // The camera preview was automatically stopped. Start it again. 
     mCamera.startPreview(); 
     mCamera.setPreviewCallback(this); 

     // Write the image in a file (in jpeg format) 
     try { 
      FileOutputStream fos = new FileOutputStream(mPictureFileName); 

      fos.write(data); 
      fos.close(); 

     } catch (java.io.IOException e) { 
      Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 

    } 
} 

-

private MyCameraView mOpenCvCameraView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     mOpenCvCameraView = (MyCameraView) view.findViewById(R.id.fd_activity_surface_view); 
     mOpenCvCameraView.setCvCameraViewListener(this); 

     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mOpenCvCameraView.enableView(); 

     String filename = "teste.jpg"; 
     mOpenCvCameraView.takePicture(filename); 
     mOpenCvCameraView.disableView(); 
    } 
+1

mCamera.setPreviewCallback(空);我正面臨空行指針異常 – user3563954 2015-07-14 12:09:48