2012-04-08 35 views
0

我創建了一個具有SurfaceView和SurfaceHolder的活動,以便創建攝像頭疊加層。出於某種原因,我在亞行收到以下內容:04-08 10:54:06.747:E /相機(1152):錯誤1。我可以拍照,但我無法獲得任何預覽。這裏是我使用的代碼:安卓中的攝像頭疊加過程中發生「錯誤1」

public class MyActivity extends Activity implements 
    SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback, OnClickListener { 
private Camera mCamera; 
private SurfaceView videoPreview; 
private SurfaceHolder surfaceHolder; 
private Button cancel; 
private Button takePicture; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    setContentView(R.layout.camera_layout); 
    videoPreview = (SurfaceView) findViewById(R.id.video_preview); 
    cancel = (Button) findViewById(R.id.cancel); 
    cancel.setOnClickListener(this); 
    takePicture = (Button) findViewById(R.id.take_picture); 
    takePicture.setOnClickListener(this); 
    surfaceHolder = videoPreview.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    // Camera.open(getNumberOfCameras() - 1); => access front facing camera as well 
    mCamera = Camera.open(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    Camera.Parameters parameters = mCamera.getParameters(); 
    // pick the device's largest supported camera size 
    List<Camera.Size> cameraSizes = parameters.getSupportedPreviewSizes(); 

    // the first size is the largest 
    Camera.Size selectedSize = cameraSizes.get(0); 

    parameters.setPreviewSize(selectedSize.width, selectedSize.height); 

    mCamera.setDisplayOrientation(90); 
    mCamera.setParameters(parameters); 

    mCamera.startPreview(); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(surfaceHolder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mCamera.stopPreview(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mCamera.release(); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.cancel: 
     finish(); 
     break; 
    case R.id.take_picture: 
     mCamera.takePicture(this, null, null, this); 
     break; 
    } 
} 

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    // store the picture 
    FileOutputStream fos = null; 
    File imageFile = null; 
    try { 
     imageFile = new File(Environment.getExternalStorageDirectory(), "custom_image1.png"); 
     fos = new FileOutputStream(imageFile); 
     fos.write(data); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (fos != null) { 
      try { 
       fos.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    mCamera.startPreview(); 
} 

@Override 
public void onShutter() { 
    // perform an animation 
} 

}

這裏是佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

<SurfaceView 
    android:layout_weight="1" 
    android:id="@+id/video_preview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<Button 
    android:id="@+id/cancel" 
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:text="Cancel" />  

<Button 
    android:id="@+id/take_picture" 
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:text="Snap Photo" /> 

</LinearLayout> 

我曾嘗試切換到RelativeLayout的,但無濟於事。我真的認爲我錯過了一些簡單的事情。任何幫助是極大的讚賞。謝謝!

回答

0

您沒有onResume()方法再次調用startPreview(),因此當您拍攝照片時,預覽未運行,因此捕獲失敗。

要測試此操作,請嘗試在拍攝圖像之前添加camera.startPreview(),然後查看是否有效。