Как обновить метаданные песни по умолчанию? - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел обновить поля метаданных песни: трек, альбом, жанр, исполнитель и изображение обложки песни, например Musicmatch.

Я пытался найти код для обновления мета, но не нашел решения.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Обновить метаданные песни мы можем с помощью тегов ID3.Мы можем обновить их с помощью редактора Mp3Tag - https://github.com/aminb/id3r, редактора MyID3 () - https://github.com/ericfarng/jid3lib и Jaudiotagger - https://github.com/Adonai/jaudiotagger.

Редактор Mp3Tag - поддерживается только тип песни Mp3. Редактор MyID3 -Может легко редактировать песню, но обновляется не все предоставленное поле. Jaudiotagger - поддерживает форматы аудио Mp3, Flac, OggVorbis, Mp4, Aiff, Wav, Wma, Dsf. Обновляет данные без проблем.

try {
      val audioFile = AudioFileIO.read(file)
            val tag = audioFile?.tagOrCreateAndSetDefault
             tag?.setField(FieldKey.ARTIST, binding?.tiArtist?.text?.toString())
            tag?.setField(FieldKey.ALBUM, binding?.tiAlbum?.text?.toString())
            tag?.setField(FieldKey.GENRE, binding?.tiGenre?.text?.toString())
            tag?.setField(FieldKey.TITLE, binding?.tiTrack?.text?.toString())

            // Handle the image setting
            try {
                    val pfd = contentResolver.openFileDescriptor(imageUri, "r") ?: return

                    val fis = FileInputStream(pfd.fileDescriptor)
                    val imgBytes = JavaUtils.readFully(fis)
                    val cover = AndroidArtwork()
                    cover.binaryData = imgBytes
                    cover.mimeType = ImageFormats.getMimeTypeForBinarySignature(byteArray)
                    cover.description = ""
                    cover.pictureType = PictureTypes.DEFAULT_ID
                    tag?.deleteArtworkField()
                    tag?.setField(cover)
                    fis.close()

              // to do check the file write option for both internal and external card
             // Handle the Storage Access FrameWork API if song is from SD card
            if (audioFile?.file?.let { SafUtils.isSafNeeded(it, this) } == true) {
              // Handle writing into SD card
              // Check if SAF permission is provided then only we can update metadata 
             // If SAF Permission is not provided. EACCESS : Permission Denied error is displayed 
            // After the permission success then only we can update meta.
                 writeIntoSDCard()
            } else {
                // Handle writing into internal card
                writeInInternalStorage()
            }
         } catch (e: Exception) { }
        } catch (e: Exception) {
            // Show error on failure while writing
        } catch (e: Error) {
            // Show error on failure while writing
        }      

Запись метаданных.

// After update refresh the file else the changes will not be reflected
AudioFileIO.write(audioFile)
MediaScannerConnection.scanFile(context, arrayOf(file?.absolutePath ?: ""), null, null)
0 голосов
/ 19 февраля 2019

Ваш вопрос не о проблеме и не является подробным.Но я могу дать вам отличный Media Player из примеров Google под названием UAMP (Universal Android Media Player) с ручкой все о Android Media Player. Ссылка

UAMP использует MediaMetadataCompat для обновления метаданных песни, как показано ниже сегмент кода.

fun MediaMetadataCompat.Builder.from(jsonMusic: JsonMusic): MediaMetadataCompat.Builder {
// The duration from the JSON is given in seconds, but the rest of the code works in
// milliseconds. Here's where we convert to the proper units.
val durationMs = TimeUnit.SECONDS.toMillis(jsonMusic.duration)

id = jsonMusic.id
title = jsonMusic.title
artist = jsonMusic.artist
album = jsonMusic.album
duration = durationMs
genre = jsonMusic.genre
mediaUri = jsonMusic.source
albumArtUri = jsonMusic.image
trackNumber = jsonMusic.trackNumber
trackCount = jsonMusic.totalTrackCount
flag = MediaItem.FLAG_PLAYABLE

// To make things easier for *displaying* these, set the display properties as well.
displayTitle = jsonMusic.title
displaySubtitle = jsonMusic.artist
displayDescription = jsonMusic.album
displayIconUri = jsonMusic.image

// Add downloadStatus to force the creation of an "extras" bundle in the resulting
// MediaMetadataCompat object. This is needed to send accurate metadata to the
// media session during updates.
downloadStatus = STATUS_NOT_DOWNLOADED

// Allow it to be used in the typical builder style.
return this

}

С помощью этого компонента вы можете обновлять данные песни в уведомлении, на экране блокировки и на главном экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...