Правенето на снимка с Android Camera Preview и запазването в SQL база данни се срива

Опитвам се да заснема снимка с помощта на визуализацията на камерата и да я съхраня в SQL база данни. Проблемите, пред които съм изправен:

  1. Прегледът на камерата ми работи добре, но когато щракна върху бутона за заснемане, който създадох, екранът просто замръзва и когато го щракна отново, се връща към предварителния преглед на камерата.
  2. Извличането на изображението от SQL база данни също дава NullPointerException и се срива всеки път, когато отворя ImageView, където искам да видя първото изображение в базата данни.

Някакви идеи как да се реши това? Благодаря.

CameraActivity.java

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.camera_activity);
    //this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    //Create an instance of Camera
    mCamera = getCameraInstance();
    setCameraDisplayOrientation(this, 0, mCamera);
    //mCamera.setFaceDetectionListener(new MyFaceDetectionListener());
    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);
    database = new MySQLiteHelper(getApplicationContext());

    Button captureButton = (Button) findViewById(R.id.button_capture);
    captureButton.setOnClickListener(
        new View.OnClickListener() {
            private PictureCallback mPicture;

            @Override
            public void onClick(View v) {
                // get an image from the camera
                mCamera.takePicture(null, null, mPicture);

                PictureCallback mPicture = new PictureCallback() {

                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {

                        try{
                            if (data != null){
                            database.addEntry(data);
                            }                   
                        }
                        catch(Exception e){

                            Log.d(TAG, e.getMessage());
                        }

                     }
                };
                mCamera.startPreview();                  
            }
        }
    );


}

база данни добавяне на изображение и извличане на изображение

public void addEntry(byte [] array) throws SQLiteException{

    SQLiteDatabase database = this.getWritableDatabase();
    String insertsql = "INSERT INTO "+TABLE_IMAGE+" ("+PICTURE_DATA+") VALUES(?)"; 
    SQLiteStatement insertStmt = database.compileStatement(insertsql);
    insertStmt.clearBindings();
    insertStmt.bindBlob(1, array);
    database.close();
}

public Bitmap getImage (){

    SQLiteDatabase database = this.getReadableDatabase();
    byte [] data = null;
    String selectquery = "SELECT "+PICTURE_DATA+" FROM "+TABLE_IMAGE;
    Cursor cursor = database.rawQuery(selectquery, null);
    cursor.moveToFirst();
    if (cursor != null && cursor.moveToFirst()){
        data = cursor.getBlob(cursor.getColumnIndex(PICTURE_DATA));
    }
        System.out.println("data length: "+ data.length);
        Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);

    database.close();
    return image;

}

CameraPreview.java

  public CameraPreview(Context context, Camera camera) {
    super(context);
    mCamera = camera;

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    // deprecated setting, but required on Android versions prior to 3.0
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, now tell the camera where to draw the preview.
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.setDisplayOrientation(90);
        mCamera.startPreview();
    } catch (IOException e) {
        Log.d(TAG, "Error setting camera preview: " + e.getMessage());
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // empty. Take care of releasing the Camera preview in your activity.
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.

    if (mHolder.getSurface() == null){
      // preview surface does not exist
      return;
    }

    // stop preview before making changes
    try {
        mCamera.stopPreview();
    } catch (Exception e){
      // ignore: tried to stop a non-existent preview
    }
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();

    } catch (Exception e){
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}

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



    mCamera = camera;

    if (mCamera != null) {
        List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
        mSupportedPreviewSizes = localSizes;
        requestLayout();

        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();
    }
}

}

Грешка от logcat

11-08 20:18:17.313: E/AndroidRuntime(15066): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.facedetector/com.example.facedetector.DisplayImages}: java.lang.NullPointerException
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.os.Looper.loop(Looper.java:137)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at android.app.ActivityThread.main(ActivityThread.java:5103)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at java.lang.reflect.Method.invoke(Method.java:525)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-08 20:18:17.313: E/AndroidRuntime(15066):    at dalvik.system.NativeStart.main(Native Method)
11-08 20:18:17.313: E/AndroidRuntime(15066): Caused by: java.lang.NullPointerException

Редактирано:

DisplayImages.java

    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_image);

    MySQLiteHelper db = new MySQLiteHelper(getApplicationContext());
    ImageView v = (ImageView) findViewById(R.id.imageView);
    v.setImageBitmap(db.getImage());

Опитвам се да покажа изображение, за да проверя дали изображението ми се съхранява в базата данни.


person Jack    schedule 08.11.2013    source източник
comment
Джагат, какво има в дейността ти DisplayImages? Моля, публикувайте го.   -  person Yauraw Gadav    schedule 08.11.2013
comment
@nOiAd добави моята дейност за показване на изображения   -  person Jack    schedule 08.11.2013


Отговори (1)


Мисля, че проблемът е във вашата активност DisplayImages.

v.setImageBitmap(db.getImage());

Мисля, че getImage() връща NULL, което причинява NullPointerException.

Винаги използвайте блока try & catch, когато има възможност за изключение.

person Yauraw Gadav    schedule 08.11.2013
comment
Благодаря... Проверих го. Наистина връща нула. Някаква идея защо? - person Jack; 08.11.2013
comment
отстранете грешки във вашия getImage(). - person Yauraw Gadav; 08.11.2013
comment
Замразяването на визуализацията е разрешено чрез това stackoverflow.com/questions/9116646/ - person Jack; 09.11.2013