0

onPreviewFrame(byte [] data、Camera camera)からデータを取得しようとしています。しかし、それは機能していないようです。このコードに問題がありますか?これのほとんどはhttp://developer.android.com/training/camera/cameradirect.htmlから直接来ました

public class UAVCamera extends Thread {

    Camera mCamera;
    CameraPreview mPreview;

    public UAVCamera(Context context) {
        mPreview = new CameraPreview(context);
    }

    @Override
    public void run() {
        safeCameraOpen();
        mPreview.setCamera(mCamera);
    }

    private boolean safeCameraOpen() {
        boolean qOpened = false;

        try {
            releaseCameraAndPreview();
            mCamera = Camera.open();
            qOpened = (mCamera != null);
        } catch (Exception e) {
            //Log.e(getString(R.string.app_name), "failed to open Camera");
            e.printStackTrace();
        }

        return qOpened;    
    }

    private void releaseCameraAndPreview() {
        mPreview.setCamera(null);
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }
}

これが私のプレビュークラスです

class CameraPreview extends ViewGroup implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mHolder;
    Camera mCamera;

    CameraPreview(Context context) {
        super(context);

        mSurfaceView = new SurfaceView(context);
        addView(mSurfaceView);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void stopPreviewAndFreeCamera() {

        if (mCamera != null) {
            /*
              Call stopPreview() to stop updating the preview surface.
            */
            mCamera.stopPreview();

            /*
              Important: Call release() to release the camera for use by other applications. 
              Applications should release the camera immediately in onPause() (and re-open() it in
              onResume()).
            */
            mCamera.release();

            mCamera = null;
        }
    }

    public void setCamera(Camera camera) {
        if (mCamera == camera) { return; }

        stopPreviewAndFreeCamera();

        mCamera = camera;

        if (mCamera != null) {

            try {
                mCamera.setPreviewDisplay(mHolder);
            } catch (IOException e) {
                e.printStackTrace();
            }

            /*
              Important: Call startPreview() to start updating the preview surface. Preview must 
              be started before you can take a picture.
              */
            mCamera.startPreview();            
            mCamera.setPreviewCallback(new PreviewCallback() {

                  public void onPreviewFrame(byte[] data, Camera camera) {

                  }
                });
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
        // TODO Auto-generated method stub

    }
}

これが私の活動です

public class MainActivity extends Activity {

    private UAVCamera uavCamera;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uavCamera = new UAVCamera(this);
        uavCamera.start();
    }                           
}

私は本当にユーザーに写真を見せなくてもかまいません。データにアクセスする必要があります。それは可能ですか?onPreviewFrame(byte [] data、Camera camera)にブレークポイントを設定しましたが、ヒットすることはありません。

4

2 に答える 2

0

setPreviewCallbackWithBuffer (Camera.PreviewCallback cb)の代わりに使用する必要が ありsetPreviewCallbackます。そして、を使用してコールバックバッファを追加しますaddCallbackBuffer(byte[])

を使用するaddCallbackBuffer(byte[])と、バイト長がプレビューサイズ(幅*高さ)より大きくなります。そうすれば、メソッドでデータを取得できると思いますonPreviewFrame

于 2013-03-04T08:37:24.240 に答える
0

http://developer.android.com/guide/topics/media/camera.html#custom-cameraの指示に従いました 問題は、アクティビティを作成していなかったことです。これをサービスとして実行し、画面がオンになっていない場合でもこの情報を取得できるようにしたいと考えています。それを行う方法がわからない。

于 2013-03-04T23:51:38.703 に答える