NullpointerException onPictureTaken

时间:2013-08-06 13:16:56

标签: android opencv android-camera

我通过Android相机拍照时遇到了一些问题。

主要目的是使用CameraControlView预览相机并通过按钮拍照。

String fileName = Environment.getExternalStorageDirectory().getPath() + "/sample_picture.jpg";
    Bitmap photo;
    mOpenCvCameraView.takePicture(fileName);
    //viewNavi.setDisplayedChild(viewNavi.indexOfChild(findViewById(R.id.image_view)));
    viewNavi.showNext();
    Bitmap newp =BitmapFactory.decodeFile(fileName);
    if(newp==null)
        return;

    ImageView imgViewResult = (ImageView) findViewById(R.id.imgViewResult);
    imgViewResult.setImageBitmap(newp);

CameraControlView.takePicture(fileLocation); 我希望在该点之后使用imageView上保存的图片,但我不能,因为保存图片进度尚未完成(由OnPictureTaken运行)。所以我想确定拍照过程是否完成。 然后我在互联网上找到了一个有用的解释,OnPictureTaken进展是保存图片的负责任的方法:

public void onPictureTaken(byte[] data, Camera camera) {
        Log.i(TAG, "Saving a bitmap to file");
        // The camera preview was automatically stopped. Start it again.
        mCamera.startPreview();
        mCamera.setPreviewCallback(this);
        // Write the image in a file (in jpeg format)

        /*My code
        ImageView imgResult = (ImageView) findViewById(R.id.imgViewResult);
        Bitmap newp = BitmapFactory.decodeByteArray(data, 0, data.length);
        imgResult.setImageBitmap(newp);
        */

        try {
            FileOutputStream fos = new FileOutputStream(mPictureFileName);
            fos.write(data);
            fos.close();

        } catch (java.io.IOException e) {
            Log.e("PictureDemo", "Exception in photoCallback", e);
        }
        isPictureTaken = true; 
    }

真正的问题是当我尝试添加此代码段时:

    ImageView imgResult = (ImageView) findViewById(R.id.imgViewResult);
    Bitmap newp = BitmapFactory.decodeByteArray(data, 0, data.length);
    imgResult.setImageBitmap(newp);

如上所示进入onPictureTaken。我得到了NullPointerException

有没有一种方法只能拍摄到位图,并以同步方式(意味着我一直使用的方式不适合我的项目。当我想在takePicture之后设置setImageBitmap。代码发送给我之前拍摄的照片[因为我使用相同的保存位置并覆盖图片]或null)

任何解释都会很棒。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我发现了一种完全不同的方式。我只是拍摄了camera_preview的最后一帧。因此,我不必处理我上面解释的先前问题。

 public class CameraControlActivity extends Activity implements CvCameraViewListener2, OnTouchListener


 public void onCameraViewStarted(int width, int height) {
    mGray = new Mat();
    mRgba = new Mat();
 }

public void onCameraViewStopped() {
    mGray.release();
    mRgba.release();
}

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    mGray = inputFrame.gray();
    mRgba = inputFrame.rgba();
    return mRgba;
}

最后是按钮点击事件

    Bitmap img = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(mRgba, img);
    img = drawORBFeatures(img);
    imgViewResult.setImageBitmap(img);
    viewNavi.setDisplayedChild(viewNavi.indexOfChild(findViewById(R.id.image_view)));

我希望有人会发现这篇文章很有用。因为当谈到在Android上拍照时,我在互联网上找不到比这更简单的方法。如何处理其他方法的副作用(无需保存照片或onPictureTaken方法的异常等)有很多讨论。