ClassCastException: MediaMetadataRetriever не может быть приведен к AutoCloseable

Я пытался использовать MediaMetadataRetriever с Kotlin use:

MediaMetadataRetriever().apply {
    setDataSource(context, uri)
}.use {
    ...
}

Но это дает мне ошибку на Android 6 Marshmallow (23 API):

java.lang.ClassCastException: android.media.MediaMetadataRetriever нельзя привести к java.lang.AutoCloseable

Почему так?

2
0
929
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

MediaMetadataRetriever реализует AutoCloseableначиная с уровня API 29.

понял, теперь мы должны проверить метод close в документации для всех других подобных классов, я думаю, Kotlin use func должен как-то проверить (или какой-то внутренний плагин Android Studio, я считаю, что это возможно), если класс не реализует AutoCloseable и дать предупреждение

user924 21.12.2020 22:19

Android — это проект с открытым исходным кодом, вы можете проверить исходники для каждой версии. Кажется, он начал реализовывать AutoClosable не так давно

API 28:

public class MediaMetadataRetriever
{

API 30

public class MediaMetadataRetriever implements AutoCloseable {

ага, от 29 API

user924 21.12.2020 22:18

Когда вы говорите, что используете метод «Kotlin» use, я предполагаю, что вы имеете в виду тот, который находится в androidx.core.content.res пакете в androidx.core:core-ktx библиотеке.

Но этот вообще не использует интерфейс AutoCloseable. Вместо этого класс MediaMetadataRetriever также предоставляет метод use начиная с API 29, как указывает пользователь sdex в своем ответе, который вы могли использовать по ошибке.

Напротив, метод use из androidx обратно совместим.

Затем вам просто нужно импортировать следующее:

import androidx.core.content.res.use

Другие вопросы по теме