NO IMAGE

Qt for Android 開發大坑

作者: qyvlik

Qt 5.5.1

這裡說一說比較常見的 Qt 開發安卓的大坑。希望同學們不要做無謂的掙扎,跳過這些坑。

輸入框

PS: QTBUG-41170, 在 2017 年 4 月,有一個比較好解決方案出現了,程式碼: AndroidKeyboardSize,部落格:QML: Resize controls when Android virtual keyboard come up

首當其衝的是輸入框,Qt 的輸入在安卓上表現不佳.

  1. 無法支援安卓原生的輸入法訪問 Qt 的輸入框,就是安卓輸入法無法複製,貼上,剪下 Qt 輸入框中的文字。

  2. 無法支援使用觸控的方式選中 Qt 輸入框中的文字。

  3. 如果輸入框的位置處於應用底部,類似於 IM 那種聊天工具,應當注意。

    a. 如果應用 Activity 設定為 android:windowSoftInputMode="adjustResize",彈出輸入法時,應用介面就會進行縮放,這個時候,應用介面就會閃爍。

    b. 如果應用 Activity 設定為 android:windowSoftInputMode="adjustPan",應用介面的頭部就會被頂出螢幕。

  4. 為了修復上訴的問題,參照如下步驟

    a. 先設定應用 Activity 設定為 android:windowSoftInputMode="adjustPan",這樣,彈出輸入法時,就不因為介面縮放而閃爍。

    b. 獲取到安卓輸入法高度。

    c. 修改輸入框,使其被點選獲取焦點之前,先彈出輸入法(Qt.inputMethod.show()),由於不是輸入框獲取焦點而彈出輸入發,所以介面既不會閃爍,也不會相對螢幕向上位移。(就是在 TextField 上放一個 MouseArea

    d. 在輸入法彈出後,就可以獲取鍵盤高度(如果在安卓上獲取鍵盤高度,是需要寫一些 Java 程式碼的)。

    e. 獲取到鍵盤高度後,直接位移輸入框(延時處理),然後 forceActiveFocus 強制獲取焦點。

  5. 上訴解決方案又引發一個問題,且聽我細細道來。

    a. 首先 Qt.inputMethod.show() 在安卓上可以直接顯示鍵盤,然後顯示時不會直接縮放介面(造成閃爍)或者將介面頂出螢幕。

    b. 接著,輸入框是一個特殊的控制元件,在輸入框獲取虛擬鍵的焦點後,安卓上的輸入法會直接記住這個控制元件的位置。

    c. 再下一次直接呼叫 Qt.inputMethod.show() 時,會找到上一次獲取焦點的輸入框的位置,根據這個位置,彈出虛擬鍵破並將介面頂出螢幕,然後輸入框才會拿到鍵盤高度,位移。

  6. 為了再解決上訴的問題,還得記錄下安卓上鍵盤的高度,然後根據鍵盤高度決定先使用 Qt.inputMethod.show() 彈出鍵盤,還是先位移輸入框。

已經具現化的解決方案GDPURJYFS/WellChat,演示視訊安卓修復鍵盤彈出介面不友善問題修復終版Demo。當然現在這些方案都有各種各樣的問題,具體要做的,其實是希望官方修復鍵盤彈出,介面縮放時閃爍的這個問題。

其他方案:QML: Resize controls when Android virtual keyboard come up

Qt Android 鍵盤問題

攝像頭

Qt 安卓應用上的攝像頭,如果直接使用 QtMultimedia::Camera 可能會出現無法很好對焦的情況,並且各個機型和不同版本系統上表現不一致,華為手機對 Qt 的支援不佳,問題會稍微多一些。

解決方法:

可以直接通過呼叫系統的攝像軟體,具體參照QtAndroid詳解(3):startActivity實戰Android拍照功能,具體程式碼 A-week-to-develop-android-app-plan/demos/CallNativeCamera

SplashScreen

啟動屏,據多數 Qter 反映,Qt 安卓應用啟動時,會顯示一個無內容,帶有標題和應用 Icon 的黑色畫面,無法直接預先顯示 SplashScreen。

本地多媒體縮圖

網路資源可以通過現有的 C 介面進行優化,快取。但是本地多媒體縮圖支援,需要自行構建一個好用的。

網頁支援

Qt 對移動平臺的網頁支援,應該是試圖通過在 QtSurface 上繪製原生網頁進行支援,所以 Qt 的網頁支援對於移動平臺來說是很孱弱的。然後 QtWebEngine 是基於谷歌的 Chromium 的,Chromium 現在對 VS 編譯支援最好,Chromium 對 MinGW 的支援基本是沒有的。

現在 Qt 在手機裝置上,使用 QtWebView 也就是在 QtSurface 上繪製原生網頁作為 Qt 在移動端上網頁的解決方案。

本地化地圖

QtQuick 中是支援地圖外掛的,但是官方只是預製了 here 等幾個國外的地圖外掛,百度地圖只能自己去封裝外掛。

相關討論有關 QML QtLocation 的 Plugin 的使用問題


FalsinSoft/Qt