无法通过Sqlite中存储的Uri查看图像

时间:2016-08-23 20:13:25

标签: android sqlite

我要做的是打开一个图像,这个图像uri应该存储在我的本地数据库中,然后在我重新打开应用程序后,最后插入的图像会出现,但是当我重新打开应用程序时我遇到了问题图像未从数据库中的uri加载。

我的代码:

private static final int PICK_IMAGE = 100;
private ImageView imageView;
SQLiteDatabase DB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = (ImageView) findViewById(R.id.image_view);

    DB = this.openOrCreateDatabase("test",MODE_PRIVATE,null);
    DB.execSQL("CREATE TABLE IF NOT EXISTS users (uri VARCHAR)");

    Cursor c = DB.rawQuery("SELECT * from users",null);
    c.moveToLast();
    int UriIndex = c.getColumnIndex("uri");
    Uri image = Uri.parse(c.getString(UriIndex));

    imageView.setImageURI(image);

    Button pickImageButton = (Button) findViewById(R.id.pick_image_button);
    pickImageButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            openGallery();
        }
    });
}

private void openGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, PICK_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) {
        Uri imageUri = data.getData();
        DB.execSQL("INSERT INTO users (uri) VALUES ('"+imageUri.toString()+"')");
        imageView.setImageURI(imageUri);
    }
}}

感谢。

1 个答案:

答案 0 :(得分:0)

您从Uri返回的ACTION_PICK将持续与活动一样长的时间。您可以使用FLAG_GRANT_READ_URI_PERMISSION和/或FLAG_GRANT_WRITE_URI_PERMISSION来临时访问其他组件。但是the Uri will be useless once your process ends,如果它有content方案(并且大多数都会)。

如果您希望长期访问Uri标识的内容:

  • 使用ACTION_OPEN_DOCUMENTtakePersistableUriPermissions()作为the Storage Access Framework的一部分,或

  • 将图片的本地副本制作到应用程序的内部存储空间