Android应用程序开发人员:尝试保存图像以存储到SQLite中

时间:2019-03-23 17:10:27

标签: java android image sqlite

我正在创建一个用于课堂的Android应用程序,如果您单击我的用户界面上的“捕获”按钮,它将带您进入相机应用程序。然后,它返回到应用程序并显示图像缩略图,如果单击“保存”按钮,它将把该按钮保存在我尚未创建的SQLite数据库中。

我的问题是试图弄清楚如何访问实际的图片及其数据,而不是有关缩略图的信息。

我正在阅读的教程具有将图像存储在Android内置的Android目录中的信息,但是我不知道如何访问实际的全尺寸图像数据以存储到我将要创建的数据库中。

这是教程的链接: https://developer.android.com/training/camera/photobasics#java

这不是完整的代码,只是一个片段,它是在Android Studio中创建的:

'''
    ImageView图片;

public void capture(View view) {
    dispatchTakePictureIntent();
}

public void save(View view) {
}

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        pic.setImageBitmap(imageBitmap); // sets the imageview on the UI as the thumbnail
    }
}

'''

1 个答案:

答案 0 :(得分:1)

我相信您需要使用

通过 takePictureIntent 意向传递存储位置(文件)的URI。
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, your_image_Uri);

然后您可以打开文件并将其检索到byte []中并将其存储为blob。 SQLiteDatase的便利性insert method使此操作非常容易。

例如假设byte []是名称my_picture,那么

ContentValues cv = new ContentValues();
cv.put(column_name_for_picture,my_picture);
long id = insert("the_table_name",null,cv);

您可以使用SQLiteDatabase query method从数据库中检索存储的图片,然后使用Cursor的 getBlob 方法提取字节[]。

但是

如果图片为2MB或更大,您将无法检索,因为CursorWindow的限制为2MB(Android的较早版本为1MB)。我建议即使在1MB的空间上,您在检索图像时也可能会遇到问题。

推荐的方法是不将图像存储在数据库中,而是存储图像存储在数据库中的文件的路径。

您可能希望看看How to use images in Android SQLite that are larger than the limitations of a CursorWindow?,因为它显示了一种变通方法,尽管不建议