Android尝试使用资源未找到方法close()

vh0rcniy  于 2022-12-16  发布在  Android
关注(0)|答案(2)|浏览(171)

我正在使用android MediaMetaDataRetriever,它在android应用程序中实现了AutoCloseable

try (final MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
    retriever.setDataSource(videoUri.getPath());
    return retriever.getFrameAtTime(10, getFrameOption());
}

最小SDK〉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,这怎么可能发生

piah890a

piah890a1#

我遇到了同样的问题,所以我在Kotlin中创建了自己的MediaMetaDataRetriever子类:

class MyMediaMetadataRetriever : MediaMetadataRetriever(), AutoCloseable {

   override fun close() {
      release()
   }

}

Java(未测试):

public class MyMediaMetadataRetriever extends MediaMetadataRetriever implements AutoCloseable {

   public MyMediaMetadataRetriever() {
      super();
   }

   @Override
   public void close() {
      release();
   }

}
2ul0zpep

2ul0zpep2#

如果MediaMetadataRetriever implements AutoCloseable.这怎么可能发生?
因为MediaMetadataRetriever直到API 29才实现AutoCloseable。所以在较旧的平台上,close()方法不存在,这正是您的崩溃也在说的。
在较旧的平台上,您必须(手动)调用release(),这是close()简单地委托给它的。
不幸的是,这意味着您不能将try-with-resources(或Kotlin的use)直接用于MediaMetadataRetriever,除非您的minSdk设置为29或更高。

相关问题