NullPointerException при сохранении пути к изображению, снятому картинкой - PullRequest
0 голосов
/ 19 марта 2012

У меня есть класс с именем «Выполнить», он расширяет Activity и реализует «SurfaceHolder.callback».

Я пытаюсь сделать снимок из cameraPreview и сохранить путь к снятому изображению с помощью MediaStore,Позже я бы сохранил этот путь в таблице БД SQLite.

Мне удалось отобразить cameraPreview, но когда я нажимаю кнопку, чтобы сделать снимок, приложение вылетает, и logCat сообщает, что существует исключение NullPointerException.Она выделяет следующую строку

uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, cv);

Я просмотрел некоторые учебные пособия и все еще не могу найти свою ошибку.

Это правильный способ сохранить путь к изображению, полученному камерой, чтобыЯ могу сохранить путь в БД позже?

Код и logcat указаны ниже

public class Run extends Activity implements SurfaceHolder.Callback{
    Button btn01;
    private android.hardware.Camera camera;
    private SurfaceHolder holder;
    SurfaceView sv01;
    boolean previewing = false;
    Uri uriTarget;
    //final CameraSurfacePreviewDemo cameraSurfacePreviewDemo = new CameraSurfacePreviewDemo(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //This line is to, set the orientation of the screen as well as adjust the viewing perspective.
        //without this line, the the default orientation is horizontal, and the viewing perspective is reversed.
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        sv01 = (SurfaceView) findViewById(R.id.sv01);
        //Intialize The Surface Holder Properly
        this.holder = sv01.getHolder();
        this.holder.addCallback(this);
        this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        btn01 = (Button) findViewById(R.id.btn01);

        btn01.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                camera.takePicture(myShutterCallback, myPictureCallbackRaw, myPictureCallbackJPG);
            }
        });
    }

    ShutterCallback myShutterCallback = new ShutterCallback() {

        @Override
        public void onShutter() {
            // TODO Auto-generated method stub

        }
    }; 

    PictureCallback myPictureCallbackRaw = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub

        }
    };

    PictureCallback myPictureCallbackJPG = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length);
            ContentValues cv = new ContentValues();

            cv.put(Images.Media.TITLE, "title");
            cv.put(Images.Media.BUCKET_ID, "test");
            cv.put(Images.Media.DESCRIPTION, "test image taken");

            uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, cv);

            OutputStream imageFileOS;

            try {
                imageFileOS = getContentResolver().openOutputStream(uriTarget);
                imageFileOS.write(data);
                imageFileOS.flush();
                imageFileOS.close();

                Toast.makeText(getBaseContext(), "ImageSaved" +uriTarget.toString(), Toast.LENGTH_SHORT).show();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            camera.startPreview();  
        }
    };


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if(previewing){
            camera.stopPreview();
            previewing = false;
    }

    if (camera != null){
     try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
            previewing = true;
     } catch (IOException e) {
      // TODO Auto-generated catch block
            e.printStackTrace();
     }
    }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera = android.hardware.Camera.open();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }
}

LogCat:

03-19 09:25:58.145: E/Surface(8932): Surface::init token -2 identity 285
03-19 09:26:05.115: E/AndroidRuntime(8932): FATAL EXCEPTION: main
03-19 09:26:05.115: E/AndroidRuntime(8932): java.lang.NullPointerException
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.os.Parcel.readException(Parcel.java:1328)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.content.ContentProviderProxy.insert(ContentProviderNative.java:408)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.content.ContentResolver.insert(ContentResolver.java:604)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at com.androidbook.CameraPreviewDemo.Run$3.onPictureTaken(Run.java:95)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.hardware.Camera$EventHandler.handleMessage(Camera.java:571)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.os.Looper.loop(Looper.java:130)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at android.app.ActivityThread.main(ActivityThread.java:3691)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at java.lang.reflect.Method.invokeNative(Native Method)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at java.lang.reflect.Method.invoke(Method.java:507)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
03-19 09:26:05.115: E/AndroidRuntime(8932):     at dalvik.system.NativeStart.main(Native Method)
...