Android попробуйте с ресурсами, метод close не найден()

#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 или более поздней версии.