androidで写真撮影した画像を直接sqliteに書き込みたい
androidで写真撮影した画像を直接sqliteに保存したいのですが上手くできません。
写真の撮影で指定のフォルダーに写真保存できるのですがsqliteに写真データの保存ができなく困っています。
BitmapDB.java
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);
}}
MainActivity.java
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;
}
}}