2013-08-16 54 views
0

我米做它使用攝像機將數據發送到一個surfaceHolder的應用程序。但是當我調用addCallBack()時,我的應用程序崩潰。下面是代碼:使用手機的攝像頭

public class Cam_View extends Activity implements SurfaceHolder.Callback{ 

private SurfaceView camView; 
private SurfaceHolder camHolder; 
private boolean previewRunning; 

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.camera); 

camView = (SurfaceView)findViewById(R.id.sview); 
camHolder = camView.getHolder(); 
camHolder.addCallback(this); 
camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
}} 

而且未實現的方法:

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 
if(previewRunning){ 
    camera.stopPreview(); 
} 
Camera.Parameters camParams = camera.getParameters(); 
camParams.setPreviewFormat(PixelFormat.JPEG); 
camera.setParameters(camParams); 
try{ 
    camera.setPreviewDisplay(holder); 
    camera.startPreview(); 
    previewRunning=true; 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
} 


public void surfaceCreated(SurfaceHolder holder) { 
try{ 
    camera=Camera.open(); 
}catch(Exception e){ 
    e.printStackTrace(); 
    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 
    finish(); 
} 
} 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
camera.stopPreview(); 
camera.release(); 
camera=null; 
    } 

爲什麼會發生應用程序崩潰時,我打電話
camHolder.addCallback(本); ? 我的代碼中是否有其他問題?

回答

1

我想你的上面code.Its我的設備上做工精細。我能夠成功啓動相機。我不認爲他們是camHolder.addCallback(this)中的問題;

問題是線

camParams.setPreviewFormat(PixelFormat.JPEG); 。

Camera.Size大小= camParams.getSupportedPreviewSizes()更新它得到(0); camParams.setPreviewSize(size.width,size.height);

您的代碼將工作。

還要確保下面的事情是正確添加。

1)命名SurfaceView sview退出在佈局

2)添加攝像頭權限 - 「android.permission.CAMERA」

如果問題仍然存在,請分享日誌。

+0

它現在工作的罰款。 – mremremre1

0

檢查這個代碼,這是爲我工作。

FIRST CameraDemo活動

public class CameraDemo extends Activity { 
    private static final String TAG = "CameraDemo"; 
    Camera camera; 
    Preview preview; 
    Button buttonClick; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera_demo); 

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 

     Log.d(TAG, "onCreate'd"); 
    } 


    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for jpeg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      long time = 0; 
      try { 
       // write to local sandbox file system 
//    outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0);  
       // Or write to sdcard 
       time = System.currentTimeMillis(); 
       outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",time));  
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 



      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 

和預覽類是:

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public static Camera camera; 

    Preview(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 



     /* camera = getCameraInstance(); 

     camera = Camera.open();*/ 

     //int cameraType = 1; // front 
     camera = Camera.open(CameraInfo.CAMERA_FACING_BACK); 



     try { 
      camera.setPreviewDisplay(holder); 


      camera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
         outStream.write(data); 
         outStream.close(); 
         Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); 
        } catch (FileNotFoundException e) { 

         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
        } 
         Preview.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static Camera getCameraInstance(){ 
     camera = null; 
     try { 
      camera = Camera.open(); // attempt to get a Camera instance 
     } 
     catch (Exception e){ 
      // Camera is not available (in use or does not exist) 
     } 
     return camera; // returns null if camera is unavailable 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 

     camera.release(); 
     camera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = camera.getParameters(); 
//  parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p= new Paint(Color.RED); 
      Log.d(TAG,"draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
}