2012-04-08 7 views
0

カメラオーバーレイを作成するためにSurfaceViewとSurfaceHolderを持つアクティビティを作成しました。何らかの理由で、私はADBで次のようになっています。04-08 10:54:06.747:E /カメラ(1152):エラー1。私は写真を撮ることができますが、プレビューを受けることはできません。ここで私が使用しているコードは次のとおりです。Androidでカメラオーバーレイ中に「エラー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

startPreview()を再度呼び出すonResume()メソッドはありません。したがって、写真を撮るときにプレビューが実行されていないため、キャプチャが失敗します。

これをテストするには、画像をキャプチャする直前にcamera.startPreview()を追加して、それが機能するかどうかを確認してください。

関連する問題