Android4.2中Bitmap的copyPixelsFromBuffer( )crash

        开发了一个观看摄像头视频的应用,一直用的很好,有一天客户突然反馈说在他的手机上崩了,顿时无语。问了下,才知道客户用的Galaxy Nexus 3用的是Android4.2系统,当初开发程序的时候,4.2的设备还木有,估计是兼容性的问题。

       找了个4.2的设备,运行报以下错误:

05-29 16:21:22.389: D/AndroidRuntime(1173): Shutting down VM
05-29 16:21:22.389: W/dalvikvm(1173): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
05-29 16:21:22.459: E/AndroidRuntime(1173): FATAL EXCEPTION: main
05-29 16:21:22.459: E/AndroidRuntime(1173): java.lang.RuntimeException: Buffer not large enough for pixels
05-29 16:21:22.459: E/AndroidRuntime(1173): at android.graphics.Bitmap.copyPixelsFromBuffer(Bitmap.java:417)
一看是Bitmap的copyPixelsFromBuffer( )方法出了问题,估计是Google在系统里动了手脚,心里想想就恨的慌。没办法,代码也没有,首先想到的是去看4.2的API的差异,没有提及与copyPixelsFromBuffer( )相关的内容。网上看了下,在这篇博文: http://blog.sina.com.cn/s/blog_7b83134b0101brgs.html找到了问题的关键。

        原来4.2中对copyPixelsFromBuffer( )执行的缓冲区进行了调整,每次拷贝结束后,将下次拷贝的起始位置置为前一次拷贝结束时的位置。这样,如果对同一个ByteBuffer执行多次连续拷贝,就要注意每次起始位置。我看了自己的代码,果然这个错误是对一个ByteBuffer进行连续二次拷贝时,第二次的起始位置没有重置为0导致的。于是在第二次执行
copyPixelsFromBuffer( )前,现执行下ByteBuffer的rewind( ),问题解决。


你可能感兴趣的:(Android4.2中Bitmap的copyPixelsFromBuffer( )crash)