最近测试提交了一个Gallery的bug,注:Android 2.3平台,都应该存在这个问题,此问题应该为原生问题。
问题描述:
操作步骤:图库→选择一张图片→菜单向左或向右旋转后→使用蓝牙分享
结果:蓝牙分享失败
我小试了一下,发现为必现问题,现象是开始可以正常传输,当传输到百分之七八十的时候,发送端提示为发送图片,分析LOG,发现一句非常
可疑的LOG:E/BtOpp ObexClient( 4553): Error when sending file: java.lang.IndexOutOfBoundsException: index outof bound
竟然说发送文件的时候某个数组越界,真是怪异的现象。为什么图片的旋转方向会影响蓝牙的传输呢??
话说无意间发现,当在Gallery3D中的LocalDataSource.java的rotateItem()函数中,注释掉这一句:
蓝牙传输就会没有问题,但是会导致接受端的图片是没有进行转角度的图片。
后来发现,其实当图片进行转角度后,底层的库会修改图片的参数,并且转角后的照片文件大小会发生变化。图片文件有可能变大,也有可能变小。
此问题根本原因:
图片旋转后,图片文件大小发生变化,但是图库应用并没有更新数据库里的SIZE字段值,但是蓝牙客户端传输前会从数据库中取出此文件大小SIZE的值,
导致创建的BYTES数组大小和真正的文件大小不能匹配,因此出现LOG中数组越界的现象。
改法1.修改蓝牙中得到文件大小的方法:直接File f = new File(path); length = f.length; 的方法得到。但是可能影响效率。
改法2.当图片转化后,更新数据库中SIZE字段的值。
在此记录一下,希望对大家有所帮助。