最近測試提交了一個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字段的值。
在此記錄一下,希望對大家有所幫助。