将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)

Posted

技术标签:

【中文标题】将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)【英文标题】:Adding metadata tags (like title, artist, album) to audio file not working (Android MediaStore) 【发布时间】:2021-12-04 07:06:41 【问题描述】:

我想创建一个音频文件并使用 android MediaStore 设置歌曲的标题、艺术家和专辑标签。创建文件有效,但不幸的是标签似乎没有设置。我做错了什么?

我的代码:

    private long createFile(Context context, String fileName, InputStream fileContent) throws IOException 
        Uri audioCollection = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Audio.Media.DISPLAY_NAME, fileName);
        contentValues.put(MediaStore.Audio.Media.TITLE, "some title");
        contentValues.put(MediaStore.Audio.Media.ARTIST, "some artist");
        contentValues.put(MediaStore.Audio.Media.ALBUM, "some album");
        contentValues.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg");

        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = contentResolver.insert(audioCollection, contentValues);

        FileOutputStream out = (FileOutputStream) contentResolver.openOutputStream(uri);
        FileChannel outChannel = out.getChannel();

        ReadableByteChannel inChannel = Channels.newChannel(fileContent);

        outChannel.transferFrom(inChannel, 0, Long.MAX_VALUE);

        out.close();

        long id = Long.parseLong(uri.getLastPathSegment());
        return id;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        AsyncTask.execute(() -> 
            Log.e(LOG_TAG, "STARTED");
            try 
                String songUrl = "https://file-examples-com.github.io/uploads/2017/11/file_example_MP3_700KB.mp3";
                InputStream in = new URL(songUrl).openStream();

                long id = createFile(getApplicationContext(), "songname", in);
                Log.e(LOG_TAG, "CREATED FILE WITH ID " + id);

             catch (IOException e) 
                Log.e(LOG_TAG, "ERROR: " + e.getMessage());
            
        );
    

【问题讨论】:

什么意思?我需要 ContentResolver 对象来插入或更新 ContentValues。我正在尝试设置歌曲标题、艺术家和专辑(ID3 标签),以便我的媒体播放器应用程序正确显示它(目前它只显示文件名)。 啊,我明白了,谢谢。我更新了我的帖子。 Android 从作为轨道一部分的相应 ID3 标签中获取值。我使用诸如 jaudiotagger 和 jid3 之类的库来编辑和更新 mp3 标签,但是这些库已经过时并且不再适用于 android 10 + (因为它们的文件 io)。我还没有找到合适的东西 由于似乎无法使用 MediaStore 设置元数据,我最终自己编写了一个标签编辑器(仅限 ID3v1)。看看我发布的答案,它应该适用于每个 android 版本。 【参考方案1】:

据我所知,目前无法使用 MediaStore 设置 ID3 标签,它只会将标签保存在设备本地,因此将文件移动到另一个设备时会丢失元数据。

所以最后我创建了自己的标签编辑器(用于 ID3v1)。有兴趣的源码:https://github.com/nh7dev/ID3v1TagEditorJava

ID3v2 更复杂:https://id3.org/id3v2.3.0

【讨论】:

@nh,我很感兴趣,但麻烦在于需要明确权限的 android10+。 Jid3 和 jauiotagger 不包含 SAF 框架,是吗? 抱歉,我不知道我从未使用过 SAF 框架。如果您可以获得具有读写权限的 File 或 FileChannel 实例,它应该可以工作

以上是关于将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)的主要内容,如果未能解决你的问题,请参考以下文章

使用 getid3() 插入专辑艺术家标签

从音频文件中获取专辑封面、歌曲名称、专辑名称和艺术家姓名

如何在音频文件中添加艺术品,以显示在专辑封面中?

VB.Net - 音频文件专辑艺术

Android - 将音频细节添加到 mp3 文件

用 bash 删除“专辑艺术家”ID3 标签?