3

私の問題でいくつかの解決策を検索しましたが、それに関連する問題がたくさんあることは確かですが、私の懸念を解決するものは何もありません。

実行時例外を受け取りました: takepicture failed:native_autofocus..etc.

オートフォーカスを使用してカメラから写真を撮ろうとしましたが、何がエラーを引き起こしたのか理解できないようです.

これが私のコードです。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mholder;
    private Camera mcamera;
    private Handler handler = new Handler();
    public CameraPreview(Context context, Camera camera) {
        super(context);
        this.mcamera = camera;
        mholder = getHolder();
        mholder.addCallback(this);
        mholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        if (mholder.getSurface() == null) {
            return;
        }
        try {
            mcamera.stopPreview();
        } catch (Exception e) {
            Log.d("surfaceChanged", e.toString());
        }
        try {
            mcamera.setPreviewDisplay(holder);
            mcamera.startPreview();           
        } catch (IOException e) {
            Log.d("surfaceChanged--->surfaceCreated", e.toString());
        }
    }

実行可能なコードに何かが欠けていると思います。実行可能なコードを省略してオートフォーカスを一度実行しようとしたところ、実行時エラーが削除されました。この部分で何かを再初期化するのを逃しましたか?

    private void autoFocus(Camera mcamera){
        final  Camera cam=mcamera;
        handler.postDelayed(new Runnable() {            
            @Override
            public void run() {         
                cam.autoFocus(autoFocusCallback);
                handler.postDelayed(this, 1500L);            
            }
        }, 1500L);
    }
    AutoFocusCallback autoFocusCallback=new AutoFocusCallback() {

        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            camera.takePicture(null, null, mPicture);
            }
    };
    private PictureCallback mPicture=new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
          //do something
        }
    };

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mcamera.setPreviewDisplay(holder);
            mcamera.startPreview();
            mcamera.autoFocus(autoFocusCallback);
        } catch (IOException e) {
            Log.d("surfaceCreated", e.toString());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}
4

2 に答える 2

0

あなたはそれについて言及しませんでしたが、マニフェストに許可を必ず含めてください。

< uses-feature android:name="android.hardware.camera.autofocus" />

于 2013-03-14T05:46:00.737 に答える
0

こちらをご覧ください

またはここ

そして、 Surfacecreated でオートフォーカスを呼び出しています。変更されたサーフェスで呼び出す必要があります

于 2013-11-16T06:52:33.533 に答える