【问题标题】:How to update the default song metadata?如何更新默认歌曲元数据?
【发布时间】:2019-02-19 05:29:03
【问题描述】:

我想像 Musicmatch 一样更新曲目、专辑、流派、艺术家和歌曲封面图像的歌曲元数据字段。

我试图寻找更新元的代码找不到任何解决方案。

【问题讨论】:

标签: android metadata media-player audio-player android-music-player


【解决方案1】:

您的问题与问题无关,也不详细。但我可以从名为 UAMP(通用 Android 媒体播放器)的谷歌示例中为您提供一个很棒的媒体播放器,并处理所有关于 android 媒体播放器的信息。 Link

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

}

通过该组件,您可以在通知、锁屏和主屏幕中更新歌曲数据。

【讨论】:

    【解决方案2】:

    要更新歌曲的元数据,我们可以使用 ID3 标签。我们可以使用 Mp3Tag 编辑器更新这些 - https://github.com/aminb/id3r , MyID3() 编辑器 - https://github.com/ericfarng/jid3lib 和 Jaudiotagger - https://github.com/Adonai/jaudiotagger

    Mp3Tag 编辑器 - 仅支持 Mp3 歌曲类型 MyID3 编辑器 - 可以轻松编辑歌曲,但并非所有提供的字段都已更新 Jaudiotagger - 这支持 mp3, 弗拉克, 奥格沃比斯, mp4, 艾夫, 哇, 哇, 单反 音频格式 它更新数据没有任何问题

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2017-09-05
      相关资源
      最近更新 更多