You need to enable JavaScript to run this app. 如何使用Java在Android SQLite数据库中存储相机拍摄的照片
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 18:54:07