Android Beam 文件傳輸失敗分析與解決方法
最近在修改Android7.0原生平臺(tái)的一些bug,其中有關(guān)Android Beam傳輸文件的一些問題還是蠻多的。所以特地找時(shí)間總結(jié)下曾經(jīng)踏過的坑。
1.傳輸?shù)奈募形臅r(shí),導(dǎo)致傳輸失敗
可能是由于Google未考慮到本地化差異,導(dǎo)致在傳輸中文文件名的文件時(shí)直接提示傳輸失敗。
packages\apps\Nfc\src\com\android\nfc\beam\MimeTypeUtil.java
其實(shí),上面忘了說了,只是從文件管理器中進(jìn)入Android Beam分享才會(huì)出現(xiàn)上面的問題。因?yàn)楫?dāng)從其他途徑,比如說從圖庫(kù)中去分享圖片,由于是通過content uri(content://com.xx.xxx/xxx)形式分享的,所以并不會(huì)直接包含文件真實(shí)路徑,也就不存在中文問題了。
當(dāng)從文件管理器中進(jìn)入Android Beam分享時(shí),是通過file uri(file://storage/xxx/aa.jpg)形式分享的,在獲取文件的mimeType的時(shí)候會(huì)走 else if 里面的流程。
frameworks\base\core\java\android\webkit\MimeTypeMap.java
從上面代碼可以看到,在獲取文件后綴名的時(shí)候,在最后對(duì)文件名做了正則匹配,包含中文的文件名肯定匹配失敗,導(dǎo)致最后返回空的后綴,所以也就返回null的mimeType。最終導(dǎo)致了文件傳輸失敗。
既然問題找出來了,修改方法也就比較簡(jiǎn)單了,將上面那一層正則判斷去掉即可;由于這個(gè)是在fwk中的方法,為了不影響其他模塊的調(diào)用。你也可以將整個(gè)方法copy到nfc模塊中,然后將正則判斷去掉。
2.傳輸?shù)奈募厥庾址麜r(shí),導(dǎo)致傳輸失敗
比如文件名包含 “#” 時(shí),會(huì)導(dǎo)致傳輸失敗。其實(shí)這個(gè)問題里面包含兩個(gè)問題:
(1).從文件管理器中通過Android Beam分享時(shí),直接傳輸失敗。
其實(shí),這個(gè)問題跟上面1中的問題也是類似的:
frameworks\base\core\java\android\webkit\MimeTypeMap.java
假如將1中的問題修復(fù)了,即下面的正則判斷去除了,最后還是返回null的mimeType,導(dǎo)致傳輸失敗。修復(fù)方法也比較簡(jiǎn)單,將上面的 “#” 處理代碼去除,同時(shí)也需要將下面的正則判斷去除。
(2).修復(fù)了(1)中的問題后,測(cè)試了幾下發(fā)現(xiàn)不管是通過文件管理器還是圖庫(kù)都提示傳輸失敗,不過跟上面不一樣的是:
通知欄進(jìn)度顯示是傳輸完畢了的,已經(jīng)100%了,但是過了一會(huì)兒接收端就提示傳輸失敗了,發(fā)送端顯示傳輸成功。
通過查看,文件也確實(shí)是傳到了接收端,不過不是在beam目錄下,而是在bluetooth目錄下。我們都知道,Android Beam傳輸文件其實(shí)底層是通過藍(lán)牙來實(shí)現(xiàn)傳輸?shù)摹V徊贿^接收端和發(fā)送端并不需要藍(lán)牙的配對(duì),而是通過nfc來建立雙方的連接。
分析代碼流程發(fā)現(xiàn),文件首先傳輸?shù)搅薭luetooth文件夾下,然后通過renameTo將傳輸?shù)絙luetooth目錄中的文件移動(dòng)到beam目錄下。
packages\apps\Nfc\src\com\android\nfc\beam\BeamTransferManager.java
所以懷疑在renameTo的時(shí)候出現(xiàn)了異常,log中也印證了這一點(diǎn)。而且srcFile打印的文件路徑中將文件名中的 “#”去除了,所以在bluetooth目錄下就找不到這個(gè)文件了,renameTo當(dāng)然會(huì)失敗。
通過一步步跟蹤傳遞uri參數(shù)的地方,發(fā)現(xiàn)Bluetooth模塊通過廣播發(fā)送過來的uri是純粹的文件路徑,/storage/emulated/0/bluetooth/weeww#.jpg。所以getScheme返回的是null,調(diào)用uri.getPath的時(shí)候,自動(dòng)將文件路徑中的”#” 去除了。
packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java
解決方法也比較簡(jiǎn)單,我們不調(diào)用uri.getPath就行了,直接將uriString傳進(jìn)構(gòu)造File的參數(shù)中。
packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java
總結(jié)
以上所述是小編給大家介紹的Android Beam 文件傳輸失敗分析與解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
android 使用okhttp可能引發(fā)OOM的一個(gè)點(diǎn)
這篇文章主要介紹了android 使用okhttp可能引發(fā)OOM的一個(gè)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10android實(shí)現(xiàn)一個(gè)圖片驗(yàn)證碼倒計(jì)時(shí)功能
本文通過實(shí)例代碼給大家介紹了android實(shí)現(xiàn)一個(gè)圖片驗(yàn)證碼倒計(jì)時(shí)功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-11-11安卓(Android)動(dòng)態(tài)創(chuàng)建多個(gè)按鈕并添加監(jiān)聽事件
本文主要介紹Android動(dòng)態(tài)創(chuàng)建多個(gè)按鈕并給每個(gè)按鍵添加監(jiān)聽事件,在做Android項(xiàng)目會(huì)經(jīng)常遇到的,希望對(duì)需要用到的同學(xué)有所幫助2016-07-07Android Gradle依賴管理、去除重復(fù)依賴、忽略的方式
這篇文章主要介紹了Android Gradle依賴管理、去除重復(fù)依賴、忽略的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android Mouse實(shí)現(xiàn)過程詳細(xì)筆記
鼠標(biāo)的實(shí)現(xiàn)有兩個(gè)步驟,一個(gè)是所有層上面的一個(gè)圖標(biāo),還有一個(gè)就是事件控制2013-09-09Android 自定義TextView去除paddingTop和paddingBottom
這篇文章主要介紹了Android 自定義TextView去除paddingTop和paddingBottom的相關(guān)資料,這里提供實(shí)例來幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09Android布局(RelativeLayout、TableLayout等)使用方法
這篇文章主要介紹了Android布局使用方法及各種屬性介紹,包括RelativeLayout、TableLayout等,感興趣的朋友可以參考一下2016-03-03Android實(shí)現(xiàn)隨機(jī)圓形云標(biāo)簽效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)隨機(jī)圓形云標(biāo)簽效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05