在圖庫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字段的值。




在此記錄一下,希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章