Добавление тегов метаданных (например, название, исполнитель, альбом) в аудиофайл, который не работает (Android MediaStore)

#android #mediastore #android-file

Вопрос:

Я хочу создать аудиофайл и установить теги заголовка, исполнителя и альбома песни с помощью 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());
            }
        });
    }
 

Комментарии:

1. Что вы имеете в виду? Мне нужен объект ContentResolver для вставки или обновления значений содержимого. Я пытаюсь установить название песни, исполнителя и альбом (теги ID3), чтобы мое приложение Media Player отображало его правильно (в настоящее время оно показывает только имя файла).).

2. А, понятно, спасибо. Я обновил свой пост.

3. Android получает значения из соответствующих тегов ID3, которые являются частью трека. Я использую такие библиотеки, как jaudiotagger и jid3, для редактирования и обновления тегов mp3, но эти библиотеки старые и больше не работают (из-за их ввода-вывода файлов) очень хорошо с Android 10 . Я пока не нашел ничего подходящего

4. Поскольку, похоже, невозможно установить метаданные с помощью MediaStore, в итоге я сам написал редактор тегов (только ID3v1). Взгляните на ответ, который я опубликовал, он должен работать на каждой версии Android.

Ответ №1:

Насколько я понимаю, сейчас невозможно установить теги ID3 с помощью MediaStore, они сохраняются только локально на устройстве, поэтому метаданные теряются при перемещении файла на другое устройство.

В итоге я создал свой собственный редактор тегов (для ID3v1). Исходный код, если кому-то интересно: https://github.com/nh7dev/ID3v1TagEditorJava

ID3v2 более сложный: https://id3.org/id3v2.3.0

Комментарии:

1. @nh, мне очень интересно, но проблема с android10 , где требуются явные разрешения. Jid3 и jauiotagger не содержат фреймворка SAF, не так ли?

2. Извините, я не знаю, я никогда не использовал SAF framework. Если вы можете получить экземпляр File или FileChannel с разрешениями на чтение и запись, он должен работать

Ответ №2:

Интересно — И почему вы не используете mp3tag f.e?

Я ищу возможность найти свою музыку по пользовательским тегам на Android. Было бы неплохо с foobar mobile.

На hydrogenaudio я получил ответ, что Android вообще не будет их индексировать. Возможно, у вас есть идея, которая поможет 😉

https://hydrogenaud.io/index.php?topic=122435.new#new