全部產品
Search
文件中心

Cloud Phone:IME最佳實務

更新時間:Oct 21, 2025

自25.07版本的雲手機鏡像開始,無影雲手機支援使用本地IME,可在部分情境下提供比雲手機內建IME更好的輸入體驗。

IME對比

本地IME是指運行雲手機用戶端或通過SDK調取雲手機畫面的本地裝置上安裝的IME,即在本地輸入,並在雲手機執行個體中進行響應並輸出。

本地IME與雲手機內建的IME相比,各有優劣,分別適用於不同的情境,具體對比如下表所示。

對比項

雲手機內建IME

本地IME

優勢

  • 相容:相容性好,可以相容幾乎任意AndroidIME;

  • 穩定:IME運行在雲端系統內,即使因弱網等因素意外中斷連線,也不會丟失正在輸入的內容。

  • 連貫:輸入體驗連貫,使用者可以使用熟悉的本地IME完成自己工作中所有的輸入,無需頻繁切換IME;

  • 流暢:按鍵和觸摸的處理、輸入的預測和推薦、選詞都在本地進行,不會因為網路延遲或弱網環境而造成遲滯感;

  • 方便:在Windows/iOS/macOS等非Android平台,都可以使用對應平台的IME,不是必須使用AndroidIME;

  • 高效:IME所需要的運算資源取自本地,不會佔用雲端算力,適合新興的AI、語音辨識IME等需要較高算力的IME。

弊端

  • 流暢性:由於網路存在物理延遲,因此觸摸和鍵盤輸入的透傳也是存在延遲的,這導致操作有遲滯感。對於弱網環境,這種遲滯感對輸入體驗造成的負面影響可能會很嚴重;

  • 便利性:非Android平台的使用者(如Windows、iOS、macOS使用者)將被迫使用AndroidIME,無法使用熟悉的IME;

  • 連貫性:整體而言輸入體驗不夠連貫,如果使用者的使用情境涉及本地應用和雲手機之間的頻繁切換,所使用的IME也會在本機IME和雲手機內建IME之間來回切換。

  • 穩定性:在完成一次輸入(通常是完成選詞)之前,本地內容不會被提交到雲側,因此意外的網路中斷可能導致正在輸入的內容丟失;

    說明

    已經輸入完成的文本不受影響,隻影響正在拼字的文本。

  • 相容性:對於極少數不調用Android標準輸入架構進行輸入操作的應用情境,可能仍然會切換到雲手機內建IME。

IME切換方法

您可以根據需要切換IME。

ADB

初次啟用

在雲手機執行個體剛剛建立完成時,需要啟用雲手機內建IME。

adb shell settings put secure enabled_input_methods "com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME:com.wuying.wyime/.PseudoImeService"
切換為本地IME
adb shell ime set com.wuying.wyime/.PseudoImeService
切換為雲手機內建IME

本樣本中使用的是雲手機預裝的GboardIME,您也可以替換為其他IME。

adb shell ime set com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME

Web SDK

說明

請擷取最新的SDK(以支援本地IME)和Demo。具體操作,請參見Web SDK

  1. 在串連時指定下面的參數。

    config.useCustomIme=true
  2. 隨後按照正常串連流程進行串連即可。詳細資料可參見Demo。

Android SDK

Android SDK要啟用本地IME,需要在StreamView串連前監聽來自ASP Engine的串連狀態回調,並在串連成功的回調中將本地IME設定為啟用狀態。

說明

請擷取最新的SDK(以支援本地IME)和Demo。具體操作,請參見Android SDK

@Override
public void onCreate() {
    super.onCreate();
    IASPEngineListener listener = new IASPEngineListener() {
        @Override
        public void onConnectionSuccess(int connectionId) {
            mStreamView.getASPEngineDelegate().setImeType(ASPIMEType.ASP_IME_TYPE_LOCAL);
            mStreamView.shouldProactivelyShowIME(true);
        }
    
        /* 注意:也需要實現其他介面 */
    }
    
    StreamView streamView = findViewById(R.id.stream_view);
    streamView.getASPEngineDelegate().registerASPEngineListener(listener);

    /* 其他 onCreate 過程 */
}

Windows SDK

由於Windows沒有統一的GUI應用程式架構,因此Windows SDK僅提供最基本的狀態回調與上行介面,與IME的互動需要您在對接時自行完成。

在Windows上使用本地IME大致包含以下步驟:

  1. 實現AspIme對象,用於接收onImeFocusUpdate回調;

  2. 建立AspClient時,調用setAspIme來註冊AspIme對象;

  3. onImeFocusUpdate(true, false)時,調起對應UI架構的IME邏輯;

  4. onImeFocusUpdate(false, false)時,隱藏對應UI架構的IME;

  5. 當IME提交字元時,調用AspClient::setImeCommit方法來提交輸入內容。

不同的GUI架構適用不同的IME互動介面,常見架構對應的介面如下:

  • Qt架構

    • 調起IME:setAttribute(Qt::WA_InputMethodEnabled, true);

    • 擷取輸入內容:通過void inputMethodEvent(QInputMethodEvent *event) override;回調

  • WPF架構

    • 調起IME:實現System.Windows.Interop.IKeyboardInputSink

    • 擷取輸入內容:實現public bool TranslateChar(ref MSG msg, ModifierKeys modifiers);