什么时候调用Camera.PictureCallback?

时间:2012-09-12 10:48:51

标签: android nullpointerexception android-camera

我在Camera对象的jpeg PictureCallback中设置成员变量,并在按下特定按钮时尝试在onClick()回调方法中使用它们。在调用takePicture()之前,此按钮不可见。但是,无论何时按下按钮,我在PictureCallback中设置的值都是 null

所以,我的估算是在takePicture()之后没有调用Callback。我已经设置了断点,但似乎无法找到它被调用的点,首先抛出NullPointerException

有什么想法吗?

这是一些代码(另外,感谢编辑,命中)

    jpeg = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream out = null;
            try {
                //create album
                String root = Environment.getExternalStorageDirectory().toString();
                myDir = new File(root + "/My Album");    
                myDir.mkdirs();

                //create naming mechanism
                Calendar c = Calendar.getInstance();
                Date d = c.getTime();
                String date = d.toGMTString().replace(" ", "");

                fname = date + ".png";
                File file = new File (myDir, fname);

                //create output stream to handle putting images to file
                out = new FileOutputStream(file);

                //get images from stream/resource - also create new bitmap to save results to
                Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);

                //this resizes the frame to fit the photo because otherwise they are misaligned
                Bitmap tFrame = frameSelected;
                Bitmap frame = Bitmap.createScaledBitmap(tFrame, 640, 480, false);
                Bitmap completed = Bitmap.createBitmap(image.getWidth(), image.getHeight(), image.getConfig());

                //create a canvas for creating the new bitmap, and paint to use with it
                Canvas canvas = new Canvas(completed);
                Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);

                //add bitmaps to canvas
                canvas.drawBitmap(image, new Matrix(), paint); //image from camera
                canvas.drawBitmap(frame, new Matrix(), paint); //frame to be added

                //compress new bitmap to a stream
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                completed.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] byteArray = stream.toByteArray();

                //add stream to file
                out.write(byteArray);
                out.close();
                Log.d("CALLBACK", "onPictureTaken - wrote bytes: " + data.length);
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
            }
            Log.d("CALLBACK", "onPictureTaken - jpeg");
        }
    };

public void onClick(View v) {
    //take photo

    if (v.getId() == R.id.take_photo_button){
        camera.takePicture(shutter, raw, null, jpeg);
        camera.stopPreview();

        s.setVisibility(View.VISIBLE);
        d.setVisibility(View.VISIBLE);
        b.setVisibility(View.INVISIBLE);
        framesSpinner.setVisibility(View.INVISIBLE);

    }
    else if (v.getId() == R.id.save_photo_button){
        Toast.makeText(this, "Photo saved to My Album", Toast.LENGTH_LONG).show();

        s.setVisibility(View.INVISIBLE);
        d.setVisibility(View.INVISIBLE);
        b.setVisibility(View.VISIBLE);
        framesSpinner.setVisibility(View.VISIBLE);

        camera.startPreview();

    }
    else if (v.getId() == R.id.delete_photo_button){
        File f = new File(myDir, fname);
        boolean isDeleted = f.delete();
        if (isDeleted){
            Toast.makeText(this, "Photo deleted", Toast.LENGTH_LONG).show();
        }
        else{
            Toast.makeText(this, "Error in deleting photo, photo not deleted", Toast.LENGTH_LONG).show();
        }
        s.setVisibility(View.INVISIBLE);
        d.setVisibility(View.INVISIBLE);
        b.setVisibility(View.VISIBLE);
        framesSpinner.setVisibility(View.VISIBLE);

        camera.startPreview();
    }
}

按下删除时的堆栈跟踪:

  

09-12 14:29:58.935:E / AndroidRuntime(25412):致命异常:主要   09-12 14:29:58.935:E / AndroidRuntime(25412):   java.lang.NullPointerException 09-12 14:29:58.935:   E / AndroidRuntime(25412):at java.io.File。(File.java:150)09-12   14:29:58.935:E / AndroidRuntime(25412):at   java.io.File。(File.java:124)09-12 14:29:58.935:   E / AndroidRuntime(25412):at   com.example.cameraoverlay.CameraActivity.onClick(CameraActivity.java:228)   09-12 14:29:58.935:E / AndroidRuntime(25412):at   android.view.View.performClick(View.java:3644)09-12 14:29:58.935:   E / AndroidRuntime(25412):at   android.view.View $ PerformClick.run(View.java:14313)09-12   14:29:58.935:E / AndroidRuntime(25412):at   android.os.Handler.handleCallback(Handler.java:605)09-12   14:29:58.935:E / AndroidRuntime(25412):at   android.os.Handler.dispatchMessage(Handler.java:92)09-12   14:29:58.935:E / AndroidRuntime(25412):at   android.os.Looper.loop(Looper.java:137)09-12 14:29:58.935:   E / AndroidRuntime(25412):at   android.app.ActivityThread.main(ActivityThread.java:4517)09-12   14:29:58.935:E / AndroidRuntime(25412):at   java.lang.reflect.Method.invokeNative(Native Method)09-12   14:29:58.935:E / AndroidRuntime(25412):at   java.lang.reflect.Method.invoke(Method.java:511)09-12 14:29:58.935:   E / AndroidRuntime(25412):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:993)   09-12 14:29:58.935:E / AndroidRuntime(25412):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)09-12   14:29:58.935:E / AndroidRuntime(25412):at   dalvik.system.NativeStart.main(原生方法)

0 个答案:

没有答案