Android開發踩坑及最佳實踐(工作踩坑記錄 持續更新...)

weixin_33890499發表於2018-11-16

音訊相關:

1)Vivo X9 發現使用usb安裝時,提示無法解析包,需在setting中禁用install run

  1. oppo R7s(4.4) Vivo X9(7.1) 錘子手機(7.1)等在許可權管理時都有各自的處理方式,其中 oppo R7s會檢測Api方法的呼叫,後兩個手機有I管家和 安全中心, 在管家和安全中心未授權時,檢測許可權仍然是已獲得許可權的狀態,此時需要設定定時器,檢查操作是否執行成功,比如音訊流

3)因為Oppo R7s(4.4) 和錘子(7.1.1)以及其他低於6.0的機型,在許可權管理時做了系統Rom級別的個性化定製。為了相容這些許可權獲取邏輯,在點選錄音按鈕時,會先開啟錄音,同時開啟定時器檢查,錄音檔案裡有沒有內容

(沒有許可權的話,就沒有內容,有許可權,就有內容)。如果錄音檔案有內容說明有許可權,就正常錄音,如果錄音檔案沒有內容,輪詢10s 還是如此的話,就將定時器和錄音停掉。

4) 但是 Vivo X9 手機即使沒有錄音許可權, 還是可以將音訊流寫入檔案,所以除了要判斷檔案length還需要判斷 //audioChunk.maxAmplitude() 其值一直為-2.147483648E9

5)實現音訊轉碼由ffmpeg 改為 Lame提高wav轉MP3的效率
在wav音訊經過SoundTouch變聲,再經過Lame 轉mp3時,會啪 的一聲,
解決方式是跳過前面500 到 4096位元組的流的寫入(Wav header )即Wav頭不寫入。

6)音訊錄製和covertWav2Mp3的過程中,音訊檔案一直被佔用或者outputStream忘記close,導致在Oppo R7s上, 音訊可以被刪除,但是下次建立時,會出現netease_audio_night變成不可識別目錄檔案的問題

其他:
1)使用MediaPlayer播放網路音訊時,要選用prePareAsync的方式,如果使用prepare方式,在無網路時,會播放阻塞造成ANR

2)在使用SoundTouch時, 在gradle build 時提示 ndK編譯
error: undefined reference to '__atomic_fetch_add_4'
需要在Android.mk中 加入LOCAL_LDLIBS += -latomic

3)以後在ViewHolder中 想知道某個View的寬高,或者想知道這個View layout 完成,使用addOnLayoutChangeListener 而不是viewTree 的GlobleLayout

關於RecycleView

發現一個有趣的事情,複寫ViewHolder.Adapter中的 onViewAttachToWindow 和 onViewDetachFromWindow (不管是LinearLayoutManager 還是GridLayoutManager)

1)該Adapter可見的Item中存在定時器在執行,且最後一個ViewHolder的View Item如果只顯示了一半,

  1. 必須要在第一屏,或者在第一屏下面的一兩條資料

3)在滿足1) 2)的條件下,這個ViewHolder 會一直觸發 onViewAttachToWindow 和 onViewDetachFromWindow

4)只有當一個ViewHolder的Item 的這一行全部顯示的時候(沒有被遮擋) 該ViewHolder的onViewAttachToWindow方法才會被執行

5)只有當一個ViewHolder的Item的這一行 完全不顯示的時候(一點都不顯示) 該ViewHolder的onViewDetachFromWindow方法才會執行

  1. 快取的ViewHolder的數目,會比 Visible 的Item 的數目多,比如可見item 9個,那麼建立的ViewHolder的數目>9 在展示第11條資料的時候

第11條ViewHolder會複用第0條ViewHolder 第0條ViewHolder的 onViewRecycled方法會執行

相關文章