Camera オブジェクトの jpeg PictureCallback 内でメンバー変数を設定しonClick()
、特定のボタンが押されたときにそれらをコールバック メソッドで使用しようとしています。このボタンは、takePicture()
が呼び出されるまで表示されません。ただし、ボタンが押されるたびに、PictureCallback に設定した値はnullになります。
したがって、私の計算では、 Callback は の後に呼び出されませんtakePicture()
。ブレークポイントを配置しましたが、呼び出されるポイントが見つからないようです。 aNullPointerException
が最初にスローされます。
何か案は?
ここにいくつかのコードがあります(また、編集していただきありがとうございます、ヒット)
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): at android.app.ActivityThread.main(ActivityThread.java:4517) 09-12 14:29:58.935: E/AndroidRuntime(25412): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-12 14:29 で:58.935: E/AndroidRuntime(25412): 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): 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): at java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-12 14:29:58.935: E/AndroidRuntime(25412): 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): 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): at java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-12 14:29:58.935: E/AndroidRuntime(25412): 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): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime(25412): dalvik.system.NativeStart.main(ネイティブ メソッド) でMethod.invokeNative(ネイティブ メソッド) 09-12 14:29:58.935: E/AndroidRuntime(25412): 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): dalvik.system.NativeStart.main(ネイティブ メソッド) でMethod.invokeNative(ネイティブ メソッド) 09-12 14:29:58.935: E/AndroidRuntime(25412): 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): dalvik.system.NativeStart.main(ネイティブ メソッド) でメイン (ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime (25412): dalvik.system.NativeStart.main (ネイティブ メソッド) でメイン (ZygoteInit.java:760) 09-12 14:29:58.935: E/AndroidRuntime (25412): dalvik.system.NativeStart.main (ネイティブ メソッド) で