对不起,我的英语
在我的应用程序中,我想添加一个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