110/13 - 把照片储存在Pictures/应用程序名称资料夹 - 3

各位铁人\教师节快乐/

昨天在显示图片的部份卡关,原本打算用contentResolver.insert()建立相片uri,然後用contentResolver.query()取得相片uri,不过contentResolver.query()一直得不到想要的内容,只好先送;另一种方法是把contentResolver.insert()取得的uri先存起来,然後再显示,不过这样不符合个人美学所以作罢。

先介绍一下ContentResolverContentResolver就是用SQLite的形式,去操作其他应用程序的增加、修改、查询、删除,所以在使用上会不太直觉,网路上也都是讲取得复数资料,例如全部的连络人,或是全部的图片,但这次我们只要取得单张图片的uri就好,以下是ContentResolver.query()的参数解说:

  1. 是从什麽应用程序找档案,因为要找图片,所以使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI
  2. 是指定档案类型,但我们全部的档案都找,所以给null
  3. 是寻找条件,所以用MediaStore.Images.ImageColumns.DISPLAY_NAMEContentResolver说我们要找档案名称,後面跟他说档案名称叫什麽= '003.jpg'
  4. 窝不知道
  5. 排序方式,因为只有找一个档案,所以ASCDESC都可以
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)

>>:  AE自动消除画面动态物件-Day27

缘起

前言 没错,今年再度在最後一天急急忙忙赶稿。 在这个好像不会任何一个框架,就无法存活的前端圈里 决定...

.Net Core Web Api_笔记07_HTTP资源操作模式OPTIONS

[HttpOptions] 用於获得自URI的资源在Request/Response过程可使用的功能...

Day 25 : XGBoost

极限梯度提升 eXtreme Gradient Boosting(XGBoost) ,被称为 Kag...

Day25 Data Storage in iOS 01 - UserDefaults

Data Storage in iOS 数据持久性( Data Persistence ) 是将任何...

Day26 - 移除没用到的 CSS,使用 Purge CSS (feat. Ant Design, Tailwind)

前言 在前端的世界中,我们经常会站在巨人的肩膀上,如果任何事情都需要自己从零开始动手做,後续的维护也...