Я пытался использовать MediaMetadataRetriever
с Kotlin use
:
MediaMetadataRetriever().apply {
setDataSource(context, uri)
}.use {
...
}
Но это дает мне ошибку на Android 6 Marshmallow (23 API):
java.lang.ClassCastException: android.media.MediaMetadataRetriever нельзя привести к java.lang.AutoCloseable
Почему так?
MediaMetadataRetriever
реализует AutoCloseable
начиная с уровня API 29.
Android — это проект с открытым исходным кодом, вы можете проверить исходники для каждой версии. Кажется, он начал реализовывать AutoClosable не так давно
API 28:
public class MediaMetadataRetriever
{
API 30
public class MediaMetadataRetriever implements AutoCloseable {
ага, от 29 API
Когда вы говорите, что используете метод «Kotlin» use
, я предполагаю, что вы имеете в виду тот, который находится в androidx.core.content.res
пакете в androidx.core:core-ktx
библиотеке.
Но этот вообще не использует интерфейс AutoCloseable
. Вместо этого класс MediaMetadataRetriever
также предоставляет метод use
начиная с API 29, как указывает пользователь sdex в своем ответе, который вы могли использовать по ошибке.
Напротив, метод use
из androidx
обратно совместим.
Затем вам просто нужно импортировать следующее:
import androidx.core.content.res.use
понял, теперь мы должны проверить метод
close
в документации для всех других подобных классов, я думаю,Kotlin use
func должен как-то проверить (или какой-то внутренний плагин Android Studio, я считаю, что это возможно), если класс не реализуетAutoCloseable
и дать предупреждение