2015-10-20 152 views
0

我想通過調用攝像頭表面視圖類的功能捕獲的位圖,但我總是得到錯誤是這樣的:Android相機SurfaceView拍照

任何幫助將不勝感激〜

java.lang.NullPointerException 
     at com.etoff.appsopengl.CameraSurfaceView.setCapture(CameraSurfaceView.java:58) 
     at com.etoff.appsopengl.Stage$MyRenderer.onDrawFrame(Stage.java:168) 
     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467) 
     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221) 

這是舞臺類編碼呼叫編碼:

public class Stage extends GLSurfaceView { 

    CameraSurfaceView csv; 
    Bitmap imgB; 

public Stage(Context context, AttributeSet attrs) { 
super(context, attrs); 

    csv = new CameraSurfaceView(context); 

} 
    //inside renderer I call the function 
    if(c==true){ 
      csv.setCapture(); 
      imgB = csv.getBitmap(); 
     } 

} 

這是CameraSurfaceView類編碼:

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

Camera mCamera; 
boolean isPreviewRunning = false; 
Bitmap mBitmap; 

CameraSurfaceView(Context context) { 
    super(context); 
    SurfaceHolder mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    synchronized(this) { 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      Log.e("Camera", "mCamera.setPreviewDisplay(holder);"); 
     } 
     mCamera.setDisplayOrientation(90); 
     mCamera.startPreview(); 

    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    synchronized(this) { 
     try { 
      if (mCamera!=null) { 
       mCamera.stopPreview(); 
       isPreviewRunning=false; 
       mCamera.release(); 
      } 
     } catch (Exception e) { 
      Log.e("Camera", e.getMessage()); 
     } 
    } 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

} 

public void setCapture(){ 
    mCamera.takePicture(null,null,mPicture); 
} 

public Bitmap getBitmap(){ 
    return mBitmap; 
} 

private Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     BitmapFactory.Options opt = new BitmapFactory.Options(); 
     opt.inMutable = true; 
     mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt); 

    } 
}; 

} 
+0

嘗試'mCamera = Camera.open(0);' –

+0

不利於= ( –

+0

然後你有多個相機。我會盡力回答 –

回答

0

使用此代碼來獲取你的背部攝像頭ID

private int findFrontFacingCamera() { 
    int cameraId = -1; 
    // Search for the front facing camera 
    int numberOfCameras = Camera.getNumberOfCameras(); 
    for (int i = 0; i < numberOfCameras; i++) { 
     CameraInfo info = new CameraInfo(); 
     Camera.getCameraInfo(i, info); 
     if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
     Log.d(DEBUG_TAG, "Camera found"); 
     cameraId = i; 
     break; 
     } 
    } 
    return cameraId; 
} 

而且使用這樣的

// do we have a camera? 
    if (!getPackageManager() 
     .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG) 
      .show(); 
    } else { 
     int cameraId = findFrontFacingCamera(); 
     if (cameraId < 0) { 
     Toast.makeText(this, "No front facing camera found.", 
      Toast.LENGTH_LONG).show(); 
     } else { 
     mCamera = Camera.open(cameraId); 
     } 
    } 
+0

我應該在哪裏編碼? –

+0

你的回答沒有幫助 –