Обложка альбома contentResolver не существует, но ее невозможно вставить в MediaStore.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Обложка альбома contentResolver не существует, но ее невозможно вставить в MediaStore.

Сообщение Anonymous »

Мое устройство — Android 11 (уровень API 29).
Я пытаюсь получить обложки альбомов (для запрошенных песен) из contentResolver, и если они это сделают не существует, я хочу вставить его.
Это мой код:

Код: Выделить всё

val folders = mutableSetOf()
if (relPath.path.isNotEmpty())
folders.add(File(relPath.path, ".."))
val audioFiles = mutableListOf()
val currentDir = File("")
val projection = arrayOf(
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.RELATIVE_PATH,
MediaStore.Audio.Media.DISPLAY_NAME
)
val sortOrder = MediaStore.Audio.Media.TITLE
contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, sortOrder)?.use {
val idIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
val titleIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)
val albumIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)
val albumIdIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)
val artistIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)
val durationIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)
val fileRelPathIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.RELATIVE_PATH)
val displayNameIdx = it.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)
while (it.moveToNext()) {
val fileRelPath = File(it.getString(fileRelPathIdx).let { if (it == "/") "" else it })

if (currentDir == fileRelPath) {  // only fetch songs if they are in this directory
val id = it.getLong(idIdx)  // TODO getColumnIndexOrThrow
val title = it.getString(titleIdx)
val album = it.getString(albumIdx)
val albumId = it.getLong(albumIdIdx)
val artist = it.getString(artistIdx)
val duration = it.getLong(durationIdx)
val displayName = it.getString(displayNameIdx)

//////////////////////// fetch cover art
val albumArtUri = ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId)
var coverArt: Bitmap? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {try {
contentResolver.loadThumbnail(albumArtUri, android.util.Size(100, 100), null)
} catch (e: IOException) {
null
}} else {
var albumArtPath: String? = null
contentResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, arrayOf(MediaStore.Audio.Albums.ALBUM_ART), "${MediaStore.Audio.Albums._ID} = ?", arrayOf(albumId.toString()), null)?.use {
if (it.moveToFirst())
albumArtPath = it.getString(it.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART))
}
BitmapFactory.decodeFile(albumArtPath)
}
////////////////////// end fetch cover art
audioFiles.add(AudioFile(id, title, album, artist, coverArt, duration))
}

//
fileRelPath.toRelativeString(relPath).substringBefore('/').takeIf(String::isNotEmpty)?.let { folders.add(if (relPath.path.isEmpty()) File(it) else File(relPath.path, it)) }

}

}
В конце концов, к моему удивлению, ни одна из моих песен не имеет обложки альбома (с использованием contentResolver).

Код: Выделить всё

$ adb shell content query --uri "content://media/external/audio/albumart"
No result found.
$ adb shell content query --uri "content://media/external/audio/albums"  | grep -vc album_art=NULL
0
Поэтому в настоящее время я использую MediaMetadataRetriever() для получения обложки альбома:

Код: Выделить всё

val retriever = MediaMetadataRetriever()
retriever.setDataSource(File(File("/sdcard", fileRelPath.path), displayName).path)
val data = retriever.embeddedPicture
retriever.release()
if (data != null) {
coverArt = BitmapFactory.decodeByteArray(data, 0, data.size)
}
Очевидно, мне следует самому вставить обложки альбомов в MediaStore: как обновить путь к обложкам альбомов с помощью contentResolver?
Это моя попытка создать обложку одного альбома:

Код: Выделить всё

val albumArtUri = Uri.parse("content://media/external/audio/albumart")
val values = ContentValues().apply {
put("album_id", albumId)
put("_data", "/sdcard/cover.jpg")  // this image does exist
}
contentResolver.insert(albumArtUri, values)
Но я получаю сообщение об ошибке:

Код: Выделить всё

android.database.sqlite.SQLiteException: table album_art has no column named _id (code 1 SQLITE_ERROR): , while compiling: INSERT INTO album_art (_data,_id) VALUES (?,_GET_ID( '/storage/emulated/0/Music/_.thumbnails/1730630794351.jpg' ))
У меня 3 вопроса:
  • это нормально, что у меня нет кэшированных обложек альбомов в MediaStore? У меня в одной папке 4300 песен, некоторые со встроенными обложками, другие с "cover.jpg" (так что с этим проблем нет).
  • поскольку у меня нет обложек альбомов MediaStore, стоит ли мне попытаться вставить его?
  • какую ошибку я получаю при попытке вставить? /storage/emulated/0/Music/_.thumbnails/1730630794351.jpg не существует (хотя папка была создана одновременно с ошибкой)
Это есть в моем манифесте: Значит, всё должно быть хорошо(?)


Подробнее здесь: https://stackoverflow.com/questions/791 ... mediastore
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • MediaStore contentResolver не возвращает файлы
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • MediaStore contentResolver не возвращает файлы
    Anonymous » » в форуме Android
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • MediaStore contentResolver ничего не возвращает при поиске в EXTERNAL_CONTENT_URI
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • «нет записи для содержимого://media/external/images/media/0» при использовании MediaStore.Images и contentResolver для п
    Anonymous » » в форуме Android
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • «Нет записи для Content: // Media/External/Images/Media/0» при использовании MediaStore.Images и ContentResolver для пол
    Гость » » в форуме Android
    0 Ответы
    36 Просмотры
    Последнее сообщение Гость

Вернуться в «Android»