1

カメラオーバーレイを作成するために、SurfaceViewとSurfaceHolderを持つアクティビティを作成しました。何らかの理由で、ADBで次のように表示されます:04-08 10:54:06.747:E / Camera(1152):エラー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に変更しようとしましたが、役に立ちませんでした。簡単なことを見逃しただけだと思います。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

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

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

于 2013-01-01T19:32:56.680 に答える