昨天在显示图片的部份卡关,原本打算用contentResolver.insert()
建立相片uri
,然後用contentResolver.query()
取得相片uri
,不过contentResolver.query()
一直得不到想要的内容,只好先送;另一种方法是把contentResolver.insert()
取得的uri
先存起来,然後再显示,不过这样不符合个人美学所以作罢。
先介绍一下ContentResolver
,ContentResolver
就是用SQLite
的形式,去操作其他应用程序的增加、修改、查询、删除,所以在使用上会不太直觉,网路上也都是讲取得复数资料,例如全部的连络人,或是全部的图片,但这次我们只要取得单张图片的uri
就好,以下是ContentResolver.query()
的参数解说:
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
null
MediaStore.Images.ImageColumns.DISPLAY_NAME
跟ContentResolver
说我们要找档案名称,後面跟他说档案名称叫什麽= '003.jpg'
ASC
或DESC
都可以val uriQuery = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null,
"${MediaStore.Images.ImageColumns.DISPLAY_NAME} = '003.jpg'",
null,
"${MediaStore.Images.ImageColumns.DATE_ADDED} DESC"
) ?: return@registerForActivityResult
找到档案後,因为ContentResolver.query()
没有提供uri
,所以我们先取得图片Id
,再用ContentUris.withAppendedId()
来组合出档案uri
,需要注意的地方是一定要先加上uriQuery.moveToFirst()
,把cursor
的位置移到第一位,不然会报IndexOutOfBoundsException
的错误
uriQuery.moveToFirst()
取得图片的Id。
val pictureId = uriQuery.getLong(uriQuery.getColumnIndex(MediaStore.Images.ImageColumns._ID))
因为Id
是整数,所以使用ContentUris.withAppendedId()
把路径和Id
组合成uri
,如果是字串的话就要改用Uri.withAppendedPath()。
val uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, pictureId)
最後就能得到图片完整uri
,这边的范例是把图片用ImageView
显示出来。
aclIvMediaStorePicture.setImageURI(uri)
全部的程序码是这样
private val takePictureResultLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { isTakePicture ->
if (!isTakePicture) {
Log.d("maho", "拍照建立档案失败")
return@registerForActivityResult
}
val uriQuery = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null,
"${MediaStore.Images.ImageColumns.DISPLAY_NAME} = '003.jpg'",
null,
"${MediaStore.Images.ImageColumns.DATE_ADDED} DESC"
) ?: return@registerForActivityResult
uriQuery.moveToFirst()
val pictureId = uriQuery.getLong(uriQuery.getColumnIndex(MediaStore.Images.ImageColumns._ID))
val uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, pictureId)
aclIvMediaStorePicture.setImageURI(uri)
}
<<: Unity自主学习(十四):认识Unity介面(5)
前言 没错,今年再度在最後一天急急忙忙赶稿。 在这个好像不会任何一个框架,就无法存活的前端圈里 决定...
[HttpOptions] 用於获得自URI的资源在Request/Response过程可使用的功能...
极限梯度提升 eXtreme Gradient Boosting(XGBoost) ,被称为 Kag...
Data Storage in iOS 数据持久性( Data Persistence ) 是将任何...
前言 在前端的世界中,我们经常会站在巨人的肩膀上,如果任何事情都需要自己从零开始动手做,後续的维护也...