Flutter 相機定製

來源:互聯網
上載者:User

標籤:size   關於   archive   odi   依賴性   get   conf   amp   重寫   

Flutter中與硬體相關的部分,一直都挺蛋疼的。方案基本上有兩種,自己寫,或者等出相關的庫。

最近做的一個項目中,需要對相機做定製。有過相關模組開發經驗的,就知道這種需求並不簡單,況且是這種跨平台解決方案的初期。

需求來了,怎麼辦呢?那就只能硬著頭皮上了。先去pub上找找,有沒有可以使用的庫。初步挑到兩個庫,一個camera,另一個是image_picker。

image_picker試了下,基本上就pass了,只能調用系統相機或者選擇相簿,相機相關部分,肯定是沒法使用。相簿部分倒是可以拿來使用。

camera試著運行了下demo,感覺這個庫可以使用,直接將相機預覽封裝成一個flutter widget。我們可以很方便的在上面進行各種定製。

設計圖上需要相機全螢幕顯示,試著在demo上修改成全屏,悲劇出現了,風一般的展開效果。添加一個調取相機的頁面,在退出相機頁面後,demo置後台,切換到前台的時候,Android這邊crash了,試了N多次,100%的crash,我勒個擦,Google官方的外掛程式寫的這麼隨意~

然後,重點來了,本文主要是解決這兩個問題,一個是全螢幕顯示的問題,另一個則是crash問題

先上一張Android端的拍照:

Android端全屏展開問題

對於這種相機展開問題,做過相機定製相關的,都會知道是預覽的解析度選擇錯誤導致的,知道這一點過後,修改起來就簡單的多了。直接拉camer plugin的源碼,Android的實現,相對還是比較簡單,一個檔案700來行代碼。找到計算預覽尺寸的方法。

    private void computeBestPreviewAndRecordingSize(        StreamConfigurationMap streamConfigurationMap, Size minPreviewSize, Size captureSize) {        ....    }

考慮到以後camera外掛程式升級的問題,直接單獨建立一個檔案進行最佳預覽尺寸的計算,然後在調用處進行替換即可。

Android端前後台切換必現crash問題

Android端前後台切換的問題,查看log發現是resume過後崩潰的,直接擼原始碼,發現外掛程式監聽了Activity的生命週期,在resume的時候進行了open操作。

  @Override  public void onActivityResumed(Activity activity) {    if (requestingPermission) {      requestingPermission = false;      return;    }    if (activity == CameraPlugin.this.activity) {      if (camera != null) {        camera.open(null);      }    }  }

問題來了,關鍵是,外掛程式沒有進行unregister操作,在退出相機頁面過後,調用dispose方法,會將camera關閉,並且將cameraDevice置為null,其他生命週期回調中調用cameraDevice的都會crash。onActivityResumed調用camer.open也會crash。這些crash的根本原因是因為沒有將回調unregister掉。瞭解這些過後,修改起來就簡單了,在dispose的時候,將外掛程式的生命週期回調給unregister掉。修改完成後,試下效果,果然都沒有crash。

後話

相關程式碼片段我就不貼出來了,關於全屏預覽尺寸的計算,網上太多的資料了,將previewSize計算正確即可。第二個crash的問題,添加一個unregisterActivityLifecycleCallbacks即可。對於修改的地方,做好注釋,後續升級外掛程式合入的時候不錯亂即可。

目前來看Flutter第三方真的很差,如果只是自己個人項目,或者一些偏向於資料展示的項目,可以試一下。但是對於商業項目,尤其是硬體依賴性比較強的,還是建議一段時間過後再看看。

大後話

Google官方的camera外掛程式,如果只是自己使用的話,可以按照上面的方法去修改,如果想要用在商業項目上,還是勸三思。

Google官方camera外掛程式Android部分,用的是camera2 API,這個API有什麼問題呢?

  1. 從21開始支援,也就是說需要放棄百分之十幾的份額;
  2. 上面版本不是最坑的,最坑的是什麼呢?硬體廠商對camera2的支援程度,遇到幾台機子,對camera2支援非常差,這些機子還是近一年比較新的機子(vivo x20a),擷取到的最大預覽解析度非常低,拍出來的圖片尺寸也對不上。

最後,重寫了Android部分,直接採用camera API,支援版本從16開始,完全沒啥問題,對硬體支援也都非常完美。Google這個坑埋的有點深,最開始考慮時間因素,結果花在外掛程式上修改解析度、修改crash、排查特殊機型問題的時間不少。

參考
  1. Android裝置對新Camera2 API的支援問題:以華為M2為例

Flutter 相機定製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.