您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

tiktok協議源碼(TikTok估值近5000億,都有哪些公司控股?) 03

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-22 19:51:39【】1人已围观

简介是否繼續往下調用切換相機的流程,很遺憾的是,兩種情況都出現了,而且都會卡住(為什么兩個status值會不一樣呢,這里先留個坑,最后來填)。這可把我難住了!就在這時腦子突然開竅,既然畫面卡住,那么必然有

是否繼續往下調用切換相機的流程,很遺憾的是,兩種情況都出現了,而且都會卡住(為什么兩個status值會不一樣呢,這里先留個坑,最后來填)。這可把我難住了!

就在這時腦子突然開竅,既然畫面卡住,那么必然有錯誤信息回調,果然一搜索CameraVideoCapture這個核心類有onError函數,毫不猶豫hook它,發現每次出錯時,這個函數的錯誤碼都會報-421錯誤(截圖省略-421錯誤碼的測試過程)。

錯誤信息非常明確的告訴我們是因為相機不支持縮放,導致的打開相機失敗,那么至此相機卡住的直接原因找到了,但是還沒找到為什么特殊的操作流程后會卡住,而正常的操作不會。于是乎繼續跟著堆棧信息往上找。

發現走進了這里的流程,導致的相機進縮放流程,為了驗證猜想,我決定在這個函數調用前,把message里的what字段改成2,讓它不走這個流程,來看看是不是就不會導致界面卡住,于是就有了下面這段代碼。

經過這一番篡改,果真隨便怎么折騰,直播界面都不會卡住了。那么我只要找到那里給handler發送的這個message就應該離真想很近了。

然后找這個handler的sendMessage相關切message的what字段賦值為1的函數。

然后我找到了它,這個函數還和縮放相關,那就八九不離十了。

按之前的堆棧繼續hook,發現卡住的時候這些方法確實都走了,而正常的時候是不走的,那么在X.Dvc的LIZ繼續用拋堆棧大法。

得到如下兩種堆棧:

•X.DCM接收到了touch事件,然后交由X.DCc這個類進行手勢判斷,發現是需要執行縮放的手勢,于是執行了相機的縮放功能(由于我們業務原因需要隱藏底部NavigationBar,在Window底部上劃會顯示NavigationBar,上劃的手勢同時觸發了控件的以為需要執行相機縮放),但是我們的虛擬攝像頭又不支持縮放,導致打開相機失敗,畫面就卡在了之前相機拿到的最后一幀。

X.DCc類

X.DCO的invoke方法

•點擊tiktok的切換相機Button,觸發進入相機的縮放,這里就和我們之前的點擊事件聯系上了,紅框部分就是補上了之前沒關注但是最重要的相機縮放功能判斷部分。

至此,我們已經把相機卡住的直接原因和根本原因都找到了,先手勢再點擊切換相機觸發了進入相機縮放功能判斷流程,由于我們的虛擬相機不支持縮放,導致打開相機失敗,卡在相機的最后一幀(也可能是黑屏)。所以只要交付給framework組開發人員,讓他們支持相機縮放相關功能就可以了。

接下來來填前面留下的坑,為什么退到后臺會導致status函數的返回值不一樣?

我們回到CameraVideoCapturer類,看看這個status()函數到底是個什么鬼!

發現他是父類ExternalVideoCapturer的函數,而且就是返回個字段,那再看看他那里進行了賦值。

通過AndroidStudio自帶的字段讀寫索引功能,很容易找到父類里的start、stop和release函數,以及自身的onErrorOnHandler函數里(也就是我們之前拋-421錯誤堆棧的函數)。如果熟悉相機開發的同學應該知道,一般我們界面退到后臺會釋放相機,然后回到前臺重新打開。那么接下來我們把這幾個函數都hook一下,來驗證猜想。

這里我多hook了一個onCaptureStarted函數,這個函數會調用父類的onStart函數,想看看是否會有調了onCaptureStarted但是沒調父類的onStart的情況。然后還hook了CameraVideoCapturer自身重寫的onStart和父類ExternalVideoCapturer的onStart函數。

下面是剛打開直播時的日志,此時status=1。

•情況一:先滑動直播界面,再按home鍵,然后回到tiktok,再切換相機,此時status()函數返回1,走了后續Camera.open流程。

這是直播退到后臺時的調用,說明確實釋放掉了,但是又調用了父類的onStart函數,那么此時的應該為2的status又變回了1。

接下來回到前臺,此時一切正常status還是為1,而且重走了自身的onStart函數,相當于相機整個流程完全重開。

再接著切換相機第一次,這時的status還是為1,相機正常,緊接著我們發現了-421錯誤,發現又重走了父類的onStart函數,那么此時status還是1。

接下來切換相機畫面卡住了,但還是走了父類的onStart。

以上就是第一種情況,由于每次切換相機都會拋完-421錯誤后,再調用父類ExternalVideoCapturer的start函數來重置status,也就造成了能調用Camera.open但是畫面卡住的情況。

•情況二:先滑動界面,再切換相機,然后按home鍵,接著回到tiktok,最后切換相機,此時status()函數返回2,沒走后續Camera.open流程。

前面流程就不貼了,直接開后面的流程記錄。

退到后臺 status=1

回到前臺status=1

切換相機第一次,畫面正常status=1

切換相機第二次,在調用switchCamera之前先拋了一次-421的錯誤,導致status=2,然后switchCamera函數里判斷status為2就被return,沒有調用Camera.open函數,接下來也沒有更多函數來重置status的狀態,所以無論怎么切換相機,都無法執行到Camera.open(),除非tiktok退到后臺,再回到前臺。

以上就是第二鐘情況。

很赞哦!(7)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:青海海西乌兰县

工作室:小组

Email:[email protected]