

androidで写真撮影した画像を直接sqliteに保存したいのですが上手くできません。  
写真の撮影で指定のフォルダーに写真保存できるのですがsqliteに写真データの保存ができなく困っています。

具体的には、onPictureTakenのsqlite書き込みの部分でcatch例外エラーとなります。

[code]

    java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.
    
[/code]

BitmapDB.java

[code]

    public class BitmapDB extends SQLiteOpenHelper {
    
    /**
     * 画像管理テーブル名
     */
    public static final String SAVE_PHOTO_TABLE = "save_photo";
    /**
     * カラム名 画像ファイル名
     */
    public static final String COLUMN_FILE_NAME = "fname";
    /**
     * カラム名 画像バイナリデータ
     */
    public static final String COLUMN_PHOTO_BINARY_DATA = "bdata";
    /**
     * アクセスするデータベース名
     */
    private static final String DB_NAME = "example.db";
    /**
     * DBのバージョン
     */
    private static final int DB_VERSION = 2;
    /**
     * create table文
     */
    private static final String createTableString = "create table "
            + SAVE_PHOTO_TABLE + "(_id integer primary key autoincrement, "
            + COLUMN_FILE_NAME + " text, " + COLUMN_PHOTO_BINARY_DATA
            + " blob)";
    
    public BitmapDB(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createTableString);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(createTableString);
    }}
    
[/code]

MainActivity.java

[code]

    public class MainActivity extends Activity {
    private SQLiteDatabase db;
    Button bt;
    SurfaceView sv;
    SurfaceHolder sh;
    Camera cm;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        setContentView(ll);
    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
        bt = new Button(this);
        bt.setText("撮影");
    
        sv = new SurfaceView(this);
        sh = sv.getHolder();
    
        sh.addCallback(new SampleSurfaceHolderCallback());
    
        ll.addView(bt);
        ll.addView(sv);
    
        bt.setOnClickListener(new SampleClickListener());
    }
    
    class SampleSurfaceHolderCallback
            implements SurfaceHolder.Callback {
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                cm = Camera.open(0);
                Camera.Parameters pr = cm.getParameters();
                List<Size> ss = pr.getSupportedPictureSizes();
                Size s = ss.get(0);
                pr.setPictureSize(s.width, s.height);
                cm.setParameters(pr);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            try {
                WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
                Display dp = wm.getDefaultDisplay();
                int rt = dp.getRotation();
                int d = 0;
                switch (rt) {
                    case Surface.ROTATION_0:
                        d = 90;
                        break;
                    case Surface.ROTATION_90:
                        d = 0;
                        break;
                    case Surface.ROTATION_180:
                        d = 270;
                        break;
                    case Surface.ROTATION_270:
                        d = 180;
                        break;
                }
                cm.setDisplayOrientation(d);
                cm.setPreviewDisplay(sv.getHolder());
    
                Camera.Parameters pr = cm.getParameters();
    
                List<Size> previewSizes = cm.getParameters().getSupportedPreviewSizes();
                Size size = previewSizes.get(0);
    
                pr.setPreviewSize(size.width, size.height);
                cm.setParameters(pr);
                cm.startPreview();
            } catch (Exception e) {
            }
        }
    
        public void surfaceDestroyed(SurfaceHolder Holder) {
            cm.stopPreview();
            cm.release();
        }
    }
    
    class SampleClickListener implements OnClickListener {
        public void onClick(View v) {
            cm.takePicture(null, null, new SamplePictureCallback());
        }
    
        class SamplePictureCallback implements PictureCallback {
    
            public void onPictureTaken(byte[] data, Camera c) {
                try {
                    File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/");
    
                    if (dir.exists() == false) {
                        dir.mkdir();
                    }
                    Time time = new Time("Asia/Tokyo");
                    time.setToNow();
                    String filename = "pic" + time.month + time.monthDay + time.hour + time.minute + time.second + ".png";
                    File f = new File(dir, filename);
    
                    ByteArrayOutputStream photo1 = getByteArrayOutputStream(dir+"/"+filename);
                    FileOutputStream fos = new FileOutputStream(f);
                    fos.write(data);
                    Toast.makeText(getApplicationContext(), "撮影完了。", Toast.LENGTH_LONG).show();
                    fos.close();
    
                    // インスタンス作成
                    BitmapDB helper = new BitmapDB(MainActivity.this);
                    // 読み書き出来るように開く
                    db = helper.getWritableDatabase();
                    // レコードの一括DELETE
                    db.delete(BitmapDB.SAVE_PHOTO_TABLE, null, null);
                    ContentValues values = new ContentValues();
                    values.put(BitmapDB.COLUMN_FILE_NAME, filename);
                    values.put(BitmapDB.COLUMN_PHOTO_BINARY_DATA, photo1.toByteArray());
                    // トランザクション正常終了
                    db.setTransactionSuccessful();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                try {
                    // レコードを検索してカーソルを作成
                    Cursor cursor = db.query(BitmapDB.SAVE_PHOTO_TABLE,
                            new String[]{"_id", BitmapDB.COLUMN_FILE_NAME,
                                    BitmapDB.COLUMN_PHOTO_BINARY_DATA}, null,
                            null, null, null, null);
                    // カーソルから値を取り出す
                    ImageView iv = new ImageView(MainActivity.this);
                    while (cursor.moveToNext()) {
    
                        // idとファイル名を受け取りTextViewとして表示
                        String str = cursor.getString(cursor.getColumnIndex("_id")) + "\t"
                                + cursor.getString(cursor
                                .getColumnIndex(BitmapDB.COLUMN_FILE_NAME));
                        TextView tv = new TextView(MainActivity.this);
    
                        tv.setText(str);
                        // BLOBをbyte[]で受け取る.
                        byte blob[] = cursor
                                .getBlob(cursor
                                        .getColumnIndex(BitmapDB.COLUMN_PHOTO_BINARY_DATA));
                        // byte[]をビットマップに変換しImageViewとして表示
                        Bitmap bmp = BitmapFactory.decodeByteArray(blob, 0, blob.length);
    
                        iv.setImageBitmap(bmp);
                        iv.setScaleType(ImageView.ScaleType.FIT_XY);//
                        iv.setAdjustViewBounds(true);//
                    }
                    Dialog dialog = new Dialog(MainActivity.this);
                    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
                    dialog.setContentView(iv);
                    dialog.show();
                    cm.startPreview();
    
                    // カーソルクローズ
                    cursor.close();
                    // DBクローズ
                    db.close();
                } catch (Exception e) {
                }
            }
        }
    
        private ByteArrayOutputStream getByteArrayOutputStream(String fileName) {
            // 返却するByteArrayOutputStream
            ByteArrayOutputStream retStream = new ByteArrayOutputStream();
            try {
                // assetsから画像ファイルを読み込みBufferedInputStreamを作成
                BufferedInputStream iS = new BufferedInputStream(getAssets().open(fileName));
                // 書き込み用int
                int writeInt;
                // ByteArrayOutputStreamに画像ファイルを書き込む
                while ((writeInt = iS.read()) != -1) {
                    retStream.write(writeInt);
                }
                // inputstreamのクローズ
                try {
                    iS.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return retStream;
        }
    }}
    
[/code]


CC BY-SA 4.0
2016-02-23T00:04:55.363
22409
2021-03-07T05:14:11.983
2021-03-07T05:14:11.983
3060
13247
question
java android sqlite camera
androidで写真撮影した画像を直接sqliteに書き込みたい


エラー内容は「その操作を行うことは出来ません、なぜならトランザクションがないからです」です。

beginTransaction()していないのにsetTransactionSuccessfulを読んでいるから例外となっています。


CC BY-SA 3.0
2016-02-23T00:57:45.887
22411
2016-02-23T00:57:45.887
7256
22409
answer