#java #android #try-with-resources
#java #Android #попробуйте с ресурсами
Вопрос:
Я использую Android, MediaMetaDataRetriever
который реализуется AutoCloseable
в приложении для Android. У меня есть приведенный ниже код
try (final MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
retriever.setDataSource(videoUri.getPath());
return retriever.getFrameAtTime(10, getFrameOption());
}
minSdk > 21
но я получаю следующий сбой
No virtual method close()V in class Landroid/media/MediaMetadataRetriever; or its super classes (declaration of ‘android.media.MediaMetadataRetriever’ appears in /system/framework/framework.jar
как это может произойти, если MediaMetadataRetriever implements AutoCloseable
Комментарии:
1. Какой уровень API вы используете?
2. Я больше не работаю над этим проектом, но я буду как один из разработчиков, который комментирует
Ответ №1:
У меня была такая же проблема, поэтому я создал свой собственный подкласс MediaMetadataRetriever в Kotlin:
class MyMediaMetadataRetriever : MediaMetadataRetriever(), AutoCloseable {
override fun close() {
release()
}
}
Java (непроверенный):
public class MyMediaMetadataRetriever extends MediaMetadataRetriever implements AutoCloseable {
public MyMediaMetadataRetriever() {
super();
}
@Override
public void close() {
release();
}
}
Комментарии:
1. вы выяснили, почему?
2. Хорошо работает для Java, спасибо.
Ответ №2:
как это может произойти, если
MediaMetadataRetriever implements AutoCloseable
.
Потому что MediaMetadataRetriever
не реализовывался AutoCloseable
до API 29. Итак, на более старых платформах close()
метод не существует, и это именно то, о чем говорит ваш сбой.
На более старых платформах вам приходится release()
вызывать close()
вручную вместо этого, что и является тем, на что вы просто делегируете.
К сожалению, это означает, что вы не можете использовать try-with-resources (или Kotlin use
) с MediaMetadataRetriever
напрямую, если для вашего minSdk не установлено значение 29 или более поздней версии.