-1

最初に、私の下手な英語をお許しください。プログラムで写真を撮るのに問題があります。カウントダウンタイマーに基づいて写真のコレクションを作成するアプリを作成し、その後、写真はC ++コードを使用して処理されています。

UI でプレビューする必要がないため、ダミーの SurfaceViewを使用しています。以下のコードは、私の電話 Xperia mini - API 15 で動作しています (権限とコードは正しいでしょう) が、学校の Nexus 5 - API 21 を借りましたが、プレビューに問題があります。

takePicture: camera 0: Cannot take picture without preview enabled

setPreviewDisplay の代わりに setPreviewTexture (以下にコメント) を使用する解決策を見つけました。通常は保存される最初の写真で機能しますが、2回目のtakePicture()の呼び出し後に同じエラーが発生します。

アドバイスありがとう、LS

Camera camera;
@Override
protected void onResume() {
    super.onResume();
    // is camera on device?
    if(!checkCameraHardware()) return;

    releaseCamera();
    try {
        camera.stopPreview();
    } catch (Exception e){
      Log.d(TAG, "No preview before.");
    }

    SurfaceView dummy = new SurfaceView(this);
    camera = Camera.open();
    Camera.Parameters params = camera.getParameters();
    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    camera.setParameters(params);

    try {
        //camera.setPreviewTexture(new SurfaceTexture(10));
        camera.setPreviewDisplay(dummy.getHolder());
    } catch (IOException e) {
        e.printStackTrace();
    }
    camera.startPreview();
}

解決:

I needed to refresh preview. The code below is working on Xperie and Nexus too. Question remains why I have to use setPreviewTexture, because setPreviewDisplay always returns error on Nexus.

    camera.takePicture(null, null, new PictureCallback() {
        @Override
        public void onPictureTaken(final byte[] data, Camera camera) {
            // save picture
            refreshPreview();
        }
    });

public void refreshPreview() {
    try {
        camera.stopPreview();
    } catch (Exception e) {}

    try {
        camera.startPreview();
    } catch (Exception e) {}
}

and in function onResume()

try {
    camera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e) {}
4

2 に答える 2

1

カメラ インスタンスでプレビューを開始するためのコールバックを追加するだけです。問題は、カメラ インスタンスでプレビューを開始した後、写真を撮影できるようになるまでに時間がかかることです。これを試して:

           camera.startPreview();
            camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    camera.takePicture(null, null, new Camera.PictureCallback() {
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                   // do something you want with your picture and stop preview
                            camera.stopPreview();
                        }
                    });
于 2015-07-01T16:58:01.787 に答える