Запрос ContentResolver не возвращает недавно вставленное видео - PullRequest
0 голосов
/ 03 августа 2020

Я вставил новое видео в MediaStore вот так,

val resolver = requireActivity().applicationContext.contentResolver
val videoCollection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val newVideoDetails = ContentValues().apply {
    put(MediaStore.Video.Media.DISPLAY_NAME, file.name)
    put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000)
    put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis())
    put(MediaStore.Video.Media.IS_PENDING, 1)
    put(MediaStore.Video.Media.TITLE, file.name)
    put(MediaStore.Video.Media.RELATIVE_PATH, relativePath)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        put(MediaStore.Video.VideoColumns.DURATION, fileDuration)
    }
}
val newVideoUri = resolver
        .insert(videoCollection, newVideoDetails)
newVideoUri?.let {
    val inputStream = FileInputStream(file)
    val outputStream = resolver.openOutputStream(newVideoUri)
    val buffer = ByteArray(4096)
    var len: Int
    while (inputStream.read(buffer).also { len = it } != -1) {
        outputStream?.write(buffer, 0, len)
    }
    outputStream?.flush()
    inputStream.close()
    outputStream?.close()
}
newVideoDetails.clear()
newVideoDetails.put(MediaStore.Video.Media.IS_PENDING, 0)
newVideoUri?.let { it1 ->
    resolver.update(it1, newVideoDetails, null, null)
}

Это работает хорошо, и видео доступно в приложении «Мои файлы» в разделе «Видео», но пока я запрашиваю, используя следующий код, contentresolver не возвращает это видео .

val projection = arrayOf(
        MediaStore.Video.Media._ID,
        MediaStore.Video.Media.DISPLAY_NAME,
        MediaStore.Video.Media.DATE_TAKEN,
        MediaStore.Video.Media.DURATION,
        MediaStore.Video.Media.SIZE/*,
        MediaStore.Video.Media.ORIENTATION*/
)
val selection = "${MediaStore.Video.Media.DATE_TAKEN} >= ?"
val selectionArgs = arrayOf(
        // Release day of the G1. :)
        dateToTimestamp(day = 22, month = 10, year = 2008).toString()
)
val sortOrder = "${MediaStore.Video.Media.DATE_TAKEN} DESC"
val cursor = getApplication<Application>().contentResolver.query(
        MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        sortOrder
)

ОБНОВЛЕНИЕ При записи с использованием FileDescriptor я могу запрашивать, но возвращает пустой файл.

newVideoUri?.let {
    resolver.openFileDescriptor(newVideoUri, "w", null).use { descriptor ->
        {
            descriptor?.let {
                FileOutputStream(descriptor.fileDescriptor).use { out ->
                    FileInputStream(file).use { inputStream ->
                        val buffer = ByteArray(4096)
                        var len: Int
                        while (inputStream.read(buffer).also { len = it } != -1) {
                            out.write(buffer, 0, len)
                        }
                        out.flush()
                        inputStream.close()
                        out.close()
                    }
                }
            }
        }
    }
    /*val inputStream = FileInputStream(file)
    val outputStream = resolver.openOutputStream(newVideoUri)
    val buffer = ByteArray(4096)
    var len: Int
    while (inputStream.read(buffer).also { len = it } != -1) {
        outputStream?.write(buffer, 0, len)
    }
    outputStream?.flush()
    inputStream.close()
    outputStream?.close()*/
}
...