VideoView getDrawingCache正在返回黑色

所以我试图做一个VideoView的屏幕截图。 我想最简单的方法是:

videoView.setDrawingCacheEnabled(true); 

那么当我需要截图的时候

 Bitmap screenshot = videoView.getDrawingCache(); 

但是由于某种原因,我每次得到的位图都是黑色的。 任何人都有这个成功吗? 我也试过:

 Bitmap bitmap = Bitmap.createBitmap(videoView.getWidth(), videoView.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); videoView.draw(canvas); 

但是,再一次,这给我一个黑色的形象。 我可以看到VideoView在Android javadoc中几乎没有logging。 任何帮助?

从View#setDrawingCacheEnabled的文档:

启用绘图caching与在硬件加速closures时设置图层类似。 启用硬件加速时,启用绘图caching对渲染没有影响,因为系统使用不同的加速机制来忽略该标记。 如果要为视图使用位图,即使已启用硬件加速,请参阅setLayerType(int,android.graphics.Paint)以获取有关如何启用软件和硬件层的信息。

VideoView有可能在硬件加速的情况下运行,并绕过caching机制。 一个好的潜水点可能会有一些亮点。

编辑 – 这篇文章似乎清除了一些事情:

对不起,由于它的性质,SurfaceView不会在正常的视图层次更新系统中绘制,所以它不会被绘制。

(VideoView是SurfaceView的孩子)

从API 10开始,您可以使用MediaMetadataRetriever在给定时间(以微秒为单位 )检索帧。 这是一个示例代码:

 public Bitmap videoFrame(String uri, long msec) { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { retriever.setDataSource(uri); return retriever.getFrameAtTime(msec); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (RuntimeException ex) { ex.printStackTrace(); } finally { try { retriever.release(); } catch (RuntimeException ex) { } } return null; }