我在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(原生方法)