如何使用Java在Android SQLite数据库中存储相机拍摄的照片
Android Java开发:将相机拍摄照片存入SQLite数据库实现方案
核心实现逻辑:SQLite支持BLOB类型存储二进制数据,我们可以将相机拍摄得到的Bitmap压缩为字节数组后直接存入该类型字段即可。
实现步骤
- 配置权限:AndroidManifest中声明相机权限,Android 6.0及以上版本需要在运行时动态申请
CAMERA权限,Android 13及以上版本如需访问公共媒体还需要申请对应照片权限。 - 创建存储图片的数据库表:建表时指定存储图片的字段为BLOB类型,建表示例代码如下:
// SQLiteOpenHelper子类的onCreate方法中执行建表逻辑 public static final String TABLE_NAME = "user_images"; public static final String KEY_ID = "id"; public static final String KEY_IMAGE_DATA = "image_data"; @Override public void onCreate(SQLiteDatabase db) { String CREATE_IMAGE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_IMAGE_DATA + " BLOB" + ")"; db.execSQL(CREATE_IMAGE_TABLE); }
- 封装数据库插入图片的方法:
// SQLiteOpenHelper子类中新增插入方法 public long insertImage(byte[] imageBytes) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_IMAGE_DATA, imageBytes); // 插入成功返回行ID,失败返回-1 long insertResult = db.insert(TABLE_NAME, null, values); db.close(); return insertResult; }
- 接收相机拍摄结果,转换格式后存入数据库:
注:以下代码中data.getExtras().get("data")默认获取的是相机返回的缩略图,若需要存储高清原图,需自行指定拍照时的输出Uri,拍摄完成后读取原图文件再转字节数组存入
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA_REQUEST && resultCode == AppCompatActivity.RESULT_OK) { Bitmap bitmap = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(bitmap); ByteArrayOutputStream stream = new ByteArrayOutputStream(); // 可根据需求调整压缩格式和质量,PNG为无损压缩,质量参数100代表无压缩 bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); // handler为自定义的SQLiteOpenHelper子类实例 long insertRes = handler.insertImage(byteArray); if (insertRes > 0) { Toast.makeText(Camera.this,"图片存储成功",Toast.LENGTH_LONG).show(); } else { Toast.makeText(Camera.this,"图片存储失败",Toast.LENGTH_LONG).show(); } } }
优化建议:不推荐在SQLite中存储超过100KB的图片,高清大图建议存到App私有目录或者公共相册,仅将图片的本地存储路径存入SQLite,可大幅降低数据库体积,提升读写性能。
内容的提问来源于stack exchange,提问作者Shraddha Singh
相关产品推荐
相关产品推荐

