中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Beam 文件傳輸失敗分析與解決方法

發布時間:2020-09-13 06:52:42 來源:腳本之家 閱讀:175 作者:RoidCoder 欄目:移動開發

最近在修改Android7.0原生平臺的一些bug,其中有關Android Beam傳輸文件的一些問題還是蠻多的。所以特地找時間總結下曾經踏過的坑。

1.傳輸的文件名包含中文時,導致傳輸失敗

可能是由于Google未考慮到本地化差異,導致在傳輸中文文件名的文件時直接提示傳輸失敗。

packages\apps\Nfc\src\com\android\nfc\beam\MimeTypeUtil.java 

Android Beam 文件傳輸失敗分析與解決方法

其實,上面忘了說了,只是從文件管理器中進入Android Beam分享才會出現上面的問題。因為當從其他途徑,比如說從圖庫中去分享圖片,由于是通過content uri(content://com.xx.xxx/xxx)形式分享的,所以并不會直接包含文件真實路徑,也就不存在中文問題了。

當從文件管理器中進入Android Beam分享時,是通過file uri(file://storage/xxx/aa.jpg)形式分享的,在獲取文件的mimeType的時候會走 else if 里面的流程。

frameworks\base\core\java\android\webkit\MimeTypeMap.java 

Android Beam 文件傳輸失敗分析與解決方法

從上面代碼可以看到,在獲取文件后綴名的時候,在最后對文件名做了正則匹配,包含中文的文件名肯定匹配失敗,導致最后返回空的后綴,所以也就返回null的mimeType。最終導致了文件傳輸失敗。

既然問題找出來了,修改方法也就比較簡單了,將上面那一層正則判斷去掉即可;由于這個是在fwk中的方法,為了不影響其他模塊的調用。你也可以將整個方法copy到nfc模塊中,然后將正則判斷去掉。

2.傳輸的文件名包含特殊字符時,導致傳輸失敗

比如文件名包含 “#” 時,會導致傳輸失敗。其實這個問題里面包含兩個問題:
(1).從文件管理器中通過Android Beam分享時,直接傳輸失敗。
其實,這個問題跟上面1中的問題也是類似的:

frameworks\base\core\java\android\webkit\MimeTypeMap.java 

Android Beam 文件傳輸失敗分析與解決方法

假如將1中的問題修復了,即下面的正則判斷去除了,最后還是返回null的mimeType,導致傳輸失敗。修復方法也比較簡單,將上面的 “#” 處理代碼去除,同時也需要將下面的正則判斷去除。

(2).修復了(1)中的問題后,測試了幾下發現不管是通過文件管理器還是圖庫都提示傳輸失敗,不過跟上面不一樣的是:
通知欄進度顯示是傳輸完畢了的,已經100%了,但是過了一會兒接收端就提示傳輸失敗了,發送端顯示傳輸成功。

通過查看,文件也確實是傳到了接收端,不過不是在beam目錄下,而是在bluetooth目錄下。我們都知道,Android Beam傳輸文件其實底層是通過藍牙來實現傳輸的。只不過接收端和發送端并不需要藍牙的配對,而是通過nfc來建立雙方的連接。

分析代碼流程發現,文件首先傳輸到了bluetooth文件夾下,然后通過renameTo將傳輸到bluetooth目錄中的文件移動到beam目錄下。

packages\apps\Nfc\src\com\android\nfc\beam\BeamTransferManager.java 

Android Beam 文件傳輸失敗分析與解決方法

所以懷疑在renameTo的時候出現了異常,log中也印證了這一點。而且srcFile打印的文件路徑中將文件名中的 “#”去除了,所以在bluetooth目錄下就找不到這個文件了,renameTo當然會失敗。

通過一步步跟蹤傳遞uri參數的地方,發現Bluetooth模塊通過廣播發送過來的uri是純粹的文件路徑,/storage/emulated/0/bluetooth/weeww#.jpg。所以getScheme返回的是null,調用uri.getPath的時候,自動將文件路徑中的”#” 去除了。

packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java 

Android Beam 文件傳輸失敗分析與解決方法

解決方法也比較簡單,我們不調用uri.getPath就行了,直接將uriString傳進構造File的參數中。

packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java 

Android Beam 文件傳輸失敗分析與解決方法

總結

以上所述是小編給大家介紹的Android Beam 文件傳輸失敗分析與解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐河县| 五大连池市| 娱乐| 中方县| 磴口县| 资溪县| 安阳市| 连江县| 泗洪县| 新昌县| 汉中市| 济阳县| 黑龙江省| 长阳| 大余县| 边坝县| 靖江市| 日土县| 太湖县| 花垣县| 长子县| 焦作市| 富顺县| 金昌市| 远安县| 宝兴县| 乌鲁木齐县| 当涂县| 阜宁县| 宿迁市| 诸暨市| 河东区| 莎车县| 资中县| 平原县| 康保县| 沿河| 岱山县| 玛沁县| 天门市| 阿拉善右旗|