MediaStore.MediaColumns.DATA 已弃用,我想将图片从图库加载到我的应用程序

Sai*_*lla 17 java android kotlin

我想使用 MediaStore.MediaColumns.DATA 将厨房中的所有图片加载到我的应用程序中,但它已被弃用。那么,加载它们的另一种方法是什么?

我现在使用此代码,但正如我所说,它已被弃用:

fun getAllShownImagesPath(activity: Activity): MutableList<String> {
    val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val cursor: Cursor?
    val columnIndexData: Int
    val listOfAllImages: MutableList<String> = mutableListOf()
    val projection = arrayOf(MediaStore.MediaColumns.DATA)
    var absolutePathOfImage: String
    cursor = activity.contentResolver.query(uri, projection, null, null, null)
    if (cursor != null) {
        columnIndexData = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
        while (cursor.moveToNext()) {
            absolutePathOfImage = cursor.getString(columnIndexData)
            listOfAllImages.add(absolutePathOfImage)
        }
        cursor.close()
    }
    return listOfAllImages
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*tes 22

我能够用它自己的文件 ID(令人难以置信的是,文件有 ID)替换 MediaStore.MediaColumns.Data 并正确构建其 URI,如下所示:

fun getAllShownImagesPath(activity: Activity): MutableList<Uri> {
    val uriExternal: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val cursor: Cursor?
    val columnIndexID: Int
    val listOfAllImages: MutableList<Uri> = mutableListOf()
    val projection = arrayOf(MediaStore.Images.Media._ID)
    var imageId: Long
    cursor = activity.contentResolver.query(uriExternal, projection, null, null, null)
    if (cursor != null) {
        columnIndexID = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
        while (cursor.moveToNext()) {
            imageId = cursor.getLong(columnIndexID)
            val uriImage = Uri.withAppendedPath(uriExternal, "" + imageId)
            listOfAllImages.add(uriImage)
        }
        cursor.close()
    }
    return listOfAllImages
}
Run Code Online (Sandbox Code Playgroud)

然后使用 Uri 在视图中构建它!


小智 6

我设法想出了以下解决方案,它是对之前答案的补充

但我仍然无法使用获得的 Uri 加载图像。 文档建议使用 openFileDescriptor() ,我这样做了,然后从中解码图像的位图:

override fun loadImagesFromStorage(): List<AdapterImage> {

    val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val cursor: Cursor?
    val columnIndexId: Int
    val listOfAllImages = mutableListOf<AdapterImage>()
    val projection = arrayOf(MediaStore.Images.Media._ID)
    cursor = context.contentResolver
        .query( uri, projection, null, null, null)

    if ( cursor != null ){
        columnIndexId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
        while (cursor.moveToNext()){

            val contentUri = ContentUris.withAppendedId(uri, cursor.getLong(columnIndexId))

            //here I open FileDescriptor and then decode it into Bitmap
            var image: Bitmap
            context.contentResolver.openFileDescriptor(contentUri, "r").use { pfd ->
                if( pfd != null ){
                    image = BitmapFactory.decodeFileDescriptor(pfd.fileDescriptor)
                    listOfAllImages.add(AdapterImage(image))
                }
            }

        }
        cursor.close()
    }

    return listOfAllImages
}
Run Code Online (Sandbox Code Playgroud)

PS 我的方法将返回我稍后在应用程序中使用的 AdapterImage 对象列表,但此时您可以将需要的任何内容放在那里


Ast*_*oid -2

从内部存储加载图像。使用 MediaStore 类读取包含图像和视频的所有文件夹。

并将结果作为 ArrayList 返回。

private fun getAllShownImagesPath(activity: Activity): ArrayList<Albums> {

val uri: Uri
val cursor: Cursor
var cursorBucket: Cursor
val column_index_data: Int
val column_index_folder_name: Int
val listOfAllImages = ArrayList<String>()
var absolutePathOfImage: String? = null
var albumsList = ArrayList<Albums>()
var album: Albums? = null


val BUCKET_GROUP_BY = "1) GROUP BY 1,(2"
val BUCKET_ORDER_BY = "MAX(datetaken) DESC"

uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI

val projection = arrayOf(MediaStore.Images.ImageColumns.BUCKET_ID,
        MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
        MediaStore.Images.ImageColumns.DATE_TAKEN,
        MediaStore.Images.ImageColumns.DATA)

cursor = activity.contentResolver.query(uri, projection, BUCKET_GROUP_BY, null, BUCKET_ORDER_BY)

if (cursor != null) {
    column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
    column_index_folder_name = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
    while (cursor.moveToNext()) {
        absolutePathOfImage = cursor.getString(column_index_data)
        Log.d("title_apps", "bucket name:" + cursor.getString(column_index_data))

        val selectionArgs = arrayOf("%" + cursor.getString(column_index_folder_name) + "%")
        val selection = MediaStore.Images.Media.DATA + " like ? "
        val projectionOnlyBucket = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)

        cursorBucket = activity.contentResolver.query(uri, projectionOnlyBucket, selection, selectionArgs, null)
        Log.d("title_apps", "bucket size:" + cursorBucket.count)

        if (absolutePathOfImage != "" && absolutePathOfImage != null) {
            listOfAllImages.add(absolutePathOfImage)
            albumsList.add(Albums(cursor.getString(column_index_folder_name), absolutePathOfImage, cursorBucket.count, false))
        }
    }
}
return getListOfVideoFolders(albumsList)
}
Run Code Online (Sandbox Code Playgroud)

// 该函数负责读取所有文件夹中的所有视频。

private fun getListOfVideoFolders(albumsList: ArrayList<Albums>): ArrayList<Albums> {
var cursor: Cursor
var cursorBucket: Cursor
var uri: Uri
val BUCKET_GROUP_BY = "1) GROUP BY 1,(2"
val BUCKET_ORDER_BY = "MAX(datetaken) DESC"
val column_index_album_name: Int
val column_index_album_video: Int

uri = android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI

val projection1 = arrayOf(MediaStore.Video.VideoColumns.BUCKET_ID,
        MediaStore.Video.VideoColumns.BUCKET_DISPLAY_NAME,
        MediaStore.Video.VideoColumns.DATE_TAKEN,
        MediaStore.Video.VideoColumns.DATA)

cursor = this.contentResolver.query(uri, projection1, BUCKET_GROUP_BY, null, BUCKET_ORDER_BY)

if (cursor != null) {
    column_index_album_name = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.BUCKET_DISPLAY_NAME)
    column_index_album_video = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)
    while (cursor.moveToNext()) {
        Log.d("title_apps", "bucket video:" + cursor.getString(column_index_album_name))
        Log.d("title_apps", "bucket video:" + cursor.getString(column_index_album_video))
        val selectionArgs = arrayOf("%" + cursor.getString(column_index_album_name) + "%")

        val selection = MediaStore.Video.Media.DATA + " like ? "
        val projectionOnlyBucket = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Video.Media.BUCKET_DISPLAY_NAME)

        cursorBucket = this.contentResolver.query(uri, projectionOnlyBucket, selection, selectionArgs, null)
        Log.d("title_apps", "bucket size:" + cursorBucket.count)

        albumsList.add(Albums(cursor.getString(column_index_album_name), cursor.getString(column_index_album_video), cursorBucket.count, true))
    }
}
return albumsList
}
Run Code Online (Sandbox Code Playgroud)