今天有空就說寫下最近遇到的難題,須要在應用內截取一個視頻播放器的當前畫面拿來分享。播放器是用Android自己的MediaPlayer+TextureView實現的,使用View中的buildDrawingCache和getDrawingCache方法截圖的時候,發現生成的Bitmap裏只有UI佈局,視頻播放畫面是不存在的。查了下API發現要得到當前TextureView顯示的內容只須要調用getBitmap方法就能夠。canvas
1 private Bitmap getScreenshot(){ 2 mPlayerLayout.buildDrawingCache(); 3 Bitmap content = mTextureView.getBitmap(); 4 Bitmap layout = mPlayerLayout.getDrawingCache(); 5 Bitmap screenshot = Bitmap.createBitmap(layout.getWidth(), layout.getHeight(), Bitmap.Config.ARGB_4444); 6 // 把兩部分拼起來,先把視頻截圖繪製到上下左右居中的位置,再把播放器的佈局元素繪製上去。 7 Canvas canvas = new Canvas(screenshot); 8 canvas.drawBitmap(content, (layout.getWidth()-content.getWidth())/2, (layout.getHeight()-content.getHeight())/2, new Paint()); 9 canvas.drawBitmap(layout, 0, 0, new Paint()); 10 canvas.save(); 11 canvas.restore(); 12 return screenshot; 13 }
拿到TextureView裏顯示的視頻內容和播放器的佈局元素合成一個新的Bitmap就能夠了。網絡
可是由於TextureView是4.0後纔有的,4.0如下只能使用SurfaceView。這樣要截圖就比較麻煩了。只能經過MediaMetadataRetriever來獲取了截圖,並且只能是在播放本地視頻時才能使用。ide
播放網絡視頻時的截圖方法暫時沒找到,麻煩知道的朋友在評論區說下。佈局
1 private Bitmap getScreenshot(){ 2 mPlayerLayout.buildDrawingCache(); 3 Bitmap content = surfaceViewCapture(); 4 Bitmap layout = mPlayerLayout.getDrawingCache(); 5 Bitmap screenshot = Bitmap.createBitmap(layout.getWidth(), layout.getHeight(), Bitmap.Config.ARGB_4444); 6 // 把兩部分拼起來,先把視頻截圖繪製到上下左右居中的位置,再把播放器的佈局元素繪製上去。 7 Canvas canvas = new Canvas(screenshot); 8 canvas.drawBitmap(screen, (layout.getWidth()-screen.getWidth())/2, (layout.getHeight()-screen.getHeight())/2, new Paint()); 9 canvas.drawBitmap(layout, 0, 0, new Paint()); 10 canvas.save(); 11 canvas.restore(); 12 return screenshot; 13 } 14 15 private Bitmap surfaceViewCapture(){ 16 MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 17 mmr.setDataSource(Environment.getExternalStorageDirectory()+"/video.mp4"); 18 return mmr.getFrameAtTime(mMediaPlayer.getCurrentPosition() * 1000); 19 }