2014-03-06 22 views
1

我正在構建一個捕獲圖像並顯示它們以進一步操作的應用程序,下面是我的代碼和來自logcat的錯誤日誌,我能做些什麼來避免空指針異常? 我有一個按鈕,開始我的相機活動,並奠定了這個預覽。 請幫助,我花了整整一天,但無法找到正確的方法來解決它。NullPointerException在parameters.getSupportedPictureFormats

public class Preview extends SurfaceView implements SurfaceHolder.Callback , PictureCallback { 
private SurfaceHolder mHolder; 
private Camera mCamera; 
private RawCallback mRawCallBack; 
public Preview(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    //mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mRawCallBack = new RawCallback(); 

    setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mCamera.takePicture(mRawCallBack, mRawCallBack, null, Preview.this); 
     } 
    }); 


} 



@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // TODO Auto-generated method stub 
    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setPreviewSize(width, height); 
    mCamera.startPreview(); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    mCamera = Camera.open(); 
    configure(mCamera); 
    try{ 
     mCamera.setPreviewDisplay(holder); 
    } catch(IOException exception){ 
     closeCamera(); 

    } 
} 

private void closeCamera() { 
    // TODO Auto-generated method stub 
    if(mCamera != null){ 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 

    } 
} 




private void configure(Camera camera) { 
    // TODO Auto-generated method stub 
    Camera.Parameters params = camera.getParameters(); 

    //configure in RGB format 
    List<Integer> formats = params.getSupportedPictureFormats(); 


    if(formats.contains(ImageFormat.RGB_565)) 
     params.setPictureFormat(ImageFormat.RGB_565); 
    else if(formats.contains(ImageFormat.JPEG)) 
     params.setPictureFormat(ImageFormat.JPEG); 
    else if(formats.contains(ImageFormat.YUY2)) 
     params.setPictureFormat(ImageFormat.YUY2); 
    else if(formats.contains(ImageFormat.YV12)) 
     params.setPictureFormat(ImageFormat.YV12); 
    else if(formats.contains(ImageFormat.NV16)) 
     params.setPictureFormat(ImageFormat.NV16); 
    else if(formats.contains(ImageFormat.NV21)) 
     params.setPictureFormat(ImageFormat.NV21); 

    // biggest Picture Support from hardware 
    List<Size> sizes = params.getSupportedPictureSizes(); 
    Camera.Size size = sizes.get(sizes.size()-1); 
    params.setPictureSize(size.width, size.height); 

    List<String> flashModes = params.getSupportedFlashModes(); 
    if(flashModes.size() > 0) 
     params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 
    //for fast moving objects, would be null if fullscreen mode is not supported 
    List<String> sceneModes = params.getSupportedSceneModes(); 
    if(sceneModes.contains(Camera.Parameters.SCENE_MODE_ACTION)) 
     params.setSceneMode(Camera.Parameters.SCENE_MODE_ACTION); 
    else 
     params.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO); 
    params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED); 
    camera.setParameters(params); 


} 



@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

    // TODO Auto-generated method stub 
    closeCamera(); 
} 

@Override 
public void onPictureTaken(byte[] jpeg, android.hardware.Camera camera) { 
    // TODO Auto-generated method stub 
    mCamera.startPreview(); 


} 

這裏是日誌

03-07 00:33:03.658: D/gralloc_goldfish(1231): Emulator without GPU emulation detected. 
03-07 00:33:13.248: D/AndroidRuntime(1231): Shutting down VM 
03-07 00:33:13.248: W/dalvikvm(1231): threadid=1: thread exiting with uncaught exception (group=0xb67ad4f0) 

03-07 00:33:13.268: E/AndroidRuntime(1231): FATAL EXCEPTION: main 
    03-07 00:33:13.268: E/AndroidRuntime(1231): java.lang.NullPointerException 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.hardware.Camera$Parameters.getSupportedPictureFormats(Camera.java:1721) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at com.in2gravity.smartdoc.Preview.configure(Preview.java:81) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at com.in2gravity.smartdoc.Preview.surfaceCreated(Preview.java:54) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.SurfaceView.updateWindow(SurfaceView.java:543) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.View.draw(View.java:6883) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.widget.FrameLayout.draw(FrameLayout.java:357) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.View.draw(View.java:6883) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.widget.FrameLayout.draw(FrameLayout.java:357) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewRoot.draw(ViewRoot.java:1522) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1258) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.os.Looper.loop(Looper.java:130) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at java.lang.reflect.Method.invokeNative(Native Method) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at java.lang.reflect.Method.invoke(Method.java:507) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    03-07 00:33:13.268: E/AndroidRuntime(1231):  at dalvik.system.NativeStart.main(Native Method) 
+0

我覺得這是不是所有的logcat的錯誤,必須有一些線條更加 –

+0

@Shayan我已經添加了前三行,我錯過了爭取 –

+0

你沒有最後一行之後的任何錯誤? –

回答

0

看起來surfaceChanged創建mCamera之前可能獲取調用?可能是一個計時的事情。把一個try/throw null檢入到surfaceChanged中並試一試。

+0

嘗試過,但仍然收到錯誤 –

相關問題