最近在做一个关于一个界面的截屏功能,但是因为含有视频模块,在使用getDrawingCache时会出现视频部分黑屏的情况。主要是因为视频和Activity的展示不是一个通道,视频使用了硬件解码的原因。
在网上找了一下,发现了一种工具类MediaMetadatRetriever可以获取媒体信息,所以就用了此类来获取视频的缩略图。具体代码如下
ViewGroup v = (ViewGroup) myActivity.getWindow().getDecorView(); View view = v.getRootView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap newBitmap = view.getDrawingCache();//获取activity的截屏 String fnm=Settings.libraryPath + Settings.displayName + ".png";//保存在本地的图片名称 Bitmap bitmap = null; String filePath = null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { if(videoName !=null){ filePath = videoName; //本地视频的路径 if(currentVideoTime==null || "".equals(currentVideoTime)){ currentVideoTime="0"; }else{ currentVideoTime = "" + (System.currentTimeMillis() - Long.parseLong(currentVideoTime)); } retriever.setDataSource(filePath); // 取得视频的长度(单位为毫秒) //String timeString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // 取得视频的长度(单位为秒) //int seconds = Integer.valueOf(timeString) /1000; //Log.v("PowerMediaProject-ScreenshotManager-createVideoBitmap","time = " + seconds); bitmap = retriever.getFrameAtTime( // Long.parseLong(currentVideoTime), videoView.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST);//获取时间点的缩略图 bitmap = zoomImg(bitmap,video_w,video_h); Canvas cv = new Canvas(newBitmap); cv.drawBitmap(bitmap,video_left,video_top, null);//在activity的截屏上left,top坐标开始画入视频缩略图 cv.save(Canvas.ALL_SAVE_FLAG);//保存 cv.restore();//存储 LogMessage.write(1,"截取视频成功"+videoName+"截屏时间"+ // currentVideoTime videoView.getCurrentPosition()*1000 ); }else{ LogMessage.write(1,"没有视频截图"); } if (newBitmap != null) { try { FileOutputStream out = new FileOutputStream(fnm); newBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);//把截图保存在本地 out.flush(); out.close(); } catch (Exception ex) { LogMessage.write(1, ex.getMessage() + ": error in take screenshot"); } } else LogMessage.write(1, "error in take screen shot,empty bitmap"); Settings.ftp.ftpUpload("/htdocs/sibo/mystore/apk", fnm,Settings.displayName+".png" ,putScreenShot); return; } catch (Exception e) { Log.e("PowerMediaProject","fail to videoScreen"+e.getMessage()); }
我的视频下载到了本地,网络源的没有测试不知道能不能使用。