在图库Gallery3D中旋转图片,然后用蓝牙分享失败

       最近测试提交了一个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字段的值。




在此记录一下,希望对大家有所帮助。

你可能感兴趣的:(数据库,android,File,测试,Path,照片)