#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 вообще не будет их индексировать. Возможно, у вас есть идея, которая поможет 😉