最近在做項目的時候遇到了這么個異常:
Bitmap too large to be uploaded into a texture
不難看出字面上的意思就是你這個Bitmap太大了,Android小妾做不到給你渲染上去哈。
我們來看看根本原因,由於項目的需要在Webview中來播放視頻,所以在Activity層我開啟了硬件加速,這帶來了得問題就是我的Bitmap的圖層超出了GPU對於openglRender的限制值,這個不同的手機會有不同的限制。
上網查資料發現有的朋友說,這個限制值可以通過canvas.getMaximumBitmapHeight()和canvas.getMaximumBitmapWidth()來獲得。
但是我發現這種方式並沒有拿到真正的限制值。
首先來給大家看看我的異常信息:
08-17 15:41:02.815: W/OpenGLRenderer(19967): Bitmap too large to be uploaded into a texture (2160x7332, max=4096x4096)
不難看出我的限制值是4096X4096,但是我通過canvas.getMaximumBitmapHeight()和canvas.getMaximumBitmapWidth()這兩個方法拿到的限制值是三萬多,顯然不正確。
后來查資料,我的解決方案如下:
第一步:拿到本設備的GPU對於openglRender的限制值
//added by Jack for handle exception "Bitmap too large to be uploaded into a texture". public boolean isNeedCloseHardwareAcceleration(int w, int h) { int[] maxSize = new int[1]; GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0); if(maxSize[0] < h || maxSize[0] < w) { return true; } return false; }
第二步:在你初始化視圖的時候判斷一下你的Bitmap的長寬是否超出了這個值,選擇關閉硬件加速。當然你也可以分片來繪圖。
至於如何開啟、關閉、判斷是否有硬件加速大家可以看看以下博文,這里我就不做介紹了。
http://www.cnblogs.com/frydsh/archive/2012/10/23/2733581.html