我在 Camera 对象的 jpeg PictureCallback 中设置成员变量,并在onClick()
按下特定按钮时尝试在回调方法中使用它们。这个按钮在takePicture()
被调用之前是不可见的。但是,每当按下按钮时,我在 PictureCallback 中设置的值都是null。
所以,我的估计是 Callback 没有被调用 after takePicture()
。我已经放了断点,但似乎找不到调用它的点,NullPointerException
首先抛出 a 。
有任何想法吗?
这是一些代码(另外,感谢您的编辑,点击)
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();
}
}
按下 Delete 时的堆栈跟踪:
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): 在 java.io.File.(File.java:150) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 java.io.File.(File.java:124 ) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 com.example.cameraoverlay.CameraActivity.onClick(CameraActivity.java:228) 09-12 14:29:58.935: E/AndroidRuntime(25412):在 android.view.View.performClick(View.java:3644) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 android.view.View$PerformClick.run(View.java:14313) 09- 12 14:29:58.935: E/AndroidRuntime(25412): 在 android.os.Handler.handleCallback(Handler.java:605) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 android.os。 Handler.dispatchMessage(Handler.java:92) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 android.os.Looper.loop(Looper.java:137) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在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):在 dalvik.system.NativeStart.main(本机方法)137) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 android.app.ActivityThread.main(ActivityThread.java:4517) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)137) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 android.app.ActivityThread.main(ActivityThread.java:4517) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 09-12 14:29:58.935: E/AndroidRuntime(25412): 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): at dalvik.system.NativeStart.main(Native Method)