选择图像保存并显示,ACTION_OPEN_DOCUMENT错误



对不起,我的英语
在我的应用程序中,我想添加一个imageView,当按下用户可以选择一个图像并将其分配给一本书,保存它并显示它
所以在我的add book活动中,我添加了一个registerForActivityResult(因为我看到开始为活动结果被弃用),并添加了一个点击监听器,这里是代码

private var imageUri: Uri? = null
private val imagePicker =
registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let {
imageUri = it
binding.imageView.setImageURI(imageUri)
}
}

点击查看图片

binding.imageView.setOnClickListener {
imagePicker.launch("image/*")
}

add book function

private fun addBook() {
// fetching info
val name: String = binding.nameEditText.text.toString()
val author: String = binding.authorEditText.text.toString()
val desc: String = binding.descEditText.text.toString()
//val imgurl: String = binding.imgurlEditText.text.toString()
// create book
val book = Book(name, author, desc, imageUri)
// adding book
bookViewModel.addToAllBooks(book)
// showing message
Toast.makeText(this, "Book has been added", Toast.LENGTH_SHORT).show()
}

(此功能设置为点击添加按钮)

我使用Room db来保存所有的书,书的一个属性是uri(我使用uri .parse(stringUri)将类型转换器添加到字符串),我稍后在一个回收器视图和显示一本书的活动中显示,我使用Glide来加载uri(不确定是否有必要)

当我离开添加图书活动的主活动,有片段显示所有的书在一个回收器视图,图像被正确加载,但当我点击一本书打开图书活动我得到这个错误(这不会崩溃我的应用程序,但我的图像视图显示什么)

打开provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{4ffae1 26378:com.example。mynewlibrary/u0a136} (pid=26378, uid=10136)要求您使用ACTION_OPEN_DOCUMENT或相关api获得访问权限

下面是加载图像的代码
private fun initView(book: Book) {
// changing app title to book name capitelized
title = book.name.lowercase()
.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
binding.nameTextView.text = book.name
binding.authorTextView.text = book.author
binding.descTextView.text = book.desc
Glide.with(this).load(book.imageUri).into(binding.imageView)
}

(同样的方法在回收器视图中使用)

我有另一个问题,这可能会影响这个,我不想如果用户从厨房中删除图像,图像将从我的应用程序中删除,我不确定它是如何工作的(我会尝试如果不是上面的错误),如果它是如何工作的,我想保存在应用程序存储的图像,所以即使删除应用程序仍然有它的图像。如果你知道怎么做,我会很高兴听到(甚至只是方法名,我会做我的研究)

我稍后在一个回收视图和显示一本书的活动中显示

如果您稍后或在其他活动中使用该uri,那么您读取该uri后面内容的权利就消失了。

ACTION_OPEN_DOCUMENT代替ACTION_GET_CONTENT

然后在onActivityResult()中获取持久的uri权限,以便…保持对该uri的读/写访问。

ActivityResultContracts.GetContent ()

等于ACTION_GET_CONTENT

相关内容

  • 没有找到相关文章

最新更新