【Touch&input 】圖像鍵盤支持(20)

用戶經常想要與emojis,貼紙以及其他豐富內容進行交流。在以前的Android版本中,軟鍵盤(也稱爲 輸入法編輯器或IME)只能將unicode表情符號發送到應用程序。對於豐富的內容,應用程序必須構建無法在其他應用程序中使用的特定於應用程序的API,或者使用通過Easy Share Action 或剪貼板發送圖像的解決方法。

在Android 7.1(API等級25)中,Android SDK包含提交內容API,該API提供了一種通用方式,可讓IME將圖像和其他豐富內容直接發送到應用中的文本編輯器。自修訂版25.0.0起,v13支持庫中也提供該API。我們建議使用支持庫,因爲它早在Android 3.2(API Level 13)上運行於設備上,並且包含幫助程序方法以簡化實施。

藉助此API,您可以構建可接收來自任何鍵盤的豐富內容的通訊應用程序,以及可將豐富內容發送到任何應用程序的鍵盤。在 谷歌鍵盤 和應用程序,如 谷歌Messenger的 支持安卓7.1的提交內容API(見圖1)。

本頁面向您展示如何在IME和應用程序中實施提交內容API。
【Touch&input 】圖像鍵盤支持(20)
圖1.圖像鍵盤支持的示例

怎麼運行的


鍵盤圖像插入需要IME和應用程序的參與。以下序列描述圖像插入過程中的每個步驟:

當用戶點擊an時EditText,編輯器發送一個它接受的MIME內容類型列表EditorInfo.contentMimeTypes。

IME讀取支持的類型列表,並在編輯器可以接受的軟鍵盤上顯示內容。

當用戶選擇圖像時,IME會調用併發commitContent()送給 InputContentInfo 編輯器。該commitContent()呼叫與呼叫類似commitText(),但對於豐富的內容。InputContentInfo包含標識內容提供者中內容的URI 。然後,您的應用可以請求權限並從URI讀取內容。
【Touch&input 】圖像鍵盤支持(20)

爲應用程序添加圖像支持


要接受來自IME的豐富內容,應用程序必須告知IME它接受哪些內容類型,並指定在收到內容時執行的回調方法。以下示例演示如何創建一個EditText接受PNG圖像的方法:

EditText editText = new EditText(this) {
    @Override
    public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
        final InputConnection ic = super.onCreateInputConnection(editorInfo);
        EditorInfoCompat.setContentMimeTypes(editorInfo,
                new String [] {"image/png"});

        final InputConnectionCompat.OnCommitContentListener callback =
            new InputConnectionCompat.OnCommitContentListener() {
                @Override
                public boolean onCommitContent(InputContentInfoCompat inputContentInfo,
                        int flags, Bundle opts) {
                    // read and display inputContentInfo asynchronously
                    if (BuildCompat.isAtLeastNMR1() && (flags &
                        InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
                        try {
                            inputContentInfo.requestPermission();
                        }
                        catch (Exception e) {
                            return false; // return false if failed
                        }
                    }

                    // read and display inputContentInfo asynchronously.
                    // call inputContentInfo.releasePermission() as needed.

                    return true;  // return true if succeeded
                }
            };
        return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
    }
};

有很多事情要做,所以讓我們來解釋一下發生了什麼。

這個例子使用支持庫,所以有一些引用來android.support.v13.view.inputmethod代替android.view.inputmethod。

這個例子創建一個EditText並覆蓋其 onCreateInputConnection(EditorInfo)修改方法InputConnection。InputConnection是IME與正在接收其輸入的應用程序之間的通信通道。

該調用super.onCreateInputConnection()保留了內置行爲(發送和接收文本),併爲您提供對InputConnection的引用。

setContentMimeTypes()將支持的MIME類型列表添加到EditorInfo。請務必在super.onCreateInputConnection()之前致電 setContentMimeTypes()。

callback在IME提交內容時執行。該方法 onCommitContent() 的引用 InputContentInfoCompat 包含內容URI。

如果您的應用在API Level 25或更高版本上運行,並且該INPUT_CONTENT_GRANT_READ_URI_PERMISSION 標誌由IME設置,則應該請求並釋放權限。否則,您應該已經可以訪問內容URI,因爲它是由IME授予的,或者因爲內容提供者不限制訪問權限。有關更多信息,請參閱將圖像支持添加到IME。
createWrapper() 將inputConnection,修改後的editorInfo和回調包裝成一個新的InputConnection並返回它。

以下是一些推薦的做法:

不支持豐富的內容不應調用編輯 setContentMimeTypes() 並離開自己的EditorInfo.contentMimeTypes 一套來null。

如果指定的MIME類型InputContentInfo 與它接受的任何類型不匹配,編輯應該忽略內容 。

豐富的內容不會影響文本光標的位置,也不會受其影響。處理內容時,編輯者可以忽略光標位置。

在編輯器的 OnCommitContentListener.onCommitContent() 方法中true,即使在加載內容之前,也可以異步返回。

與提交前可在IME中編輯的文本不同,豐富的內容會立即提交。請注意,如果您想爲用戶提供編輯或刪除內容的能力,則必須自己實施邏輯。

要測試您的應用,請確保您的設備或模擬器具有能夠發送豐富內容的鍵盤。您可以使用Android 7.1或更高版本的Google鍵盤,也可以安裝CommitContent IME示例。

有關完整的代碼示例,請參閱CommitContent App示例

爲IME添加圖像支持


想要嚮應用發送豐富內容的IME必須實現Commit Content API,如下所示:
覆蓋onStartInput()或onStartInputView()從目標編輯器讀取支持的內容類型列表。以下代碼片段顯示瞭如何檢查目標編輯器是否接受GIF圖像。

@Override
public void onStartInputView(EditorInfo info, boolean restarting) {
    String[] mimeTypes = EditorInfoCompat.getContentMimeTypes(editorInfo);

    boolean gifSupported = false;
    for (String mimeType : mimeTypes) {
        if (ClipDescription.compareMimeTypes(mimeType, "image/gif")) {
            gifSupported = true;
        }
    }

    if (gifSupported) {
        // the target editor supports GIFs. enable corresponding content
    } else {
        // the target editor does not support GIFs. disable corresponding content
    }
}

當用戶選擇圖像時向內容提交內容。避免commitContent() 在有任何撰寫文本時調用 ,因爲這可能會導致編輯器失去焦點。以下代碼片段顯示瞭如何提交GIF圖像。

/**
 * Commits a GIF image
 *
 * @param contentUri Content URI of the GIF image to be sent
 * @param imageDescription Description of the GIF image to be sent
 */
public static void commitGifImage(Uri contentUri, String imageDescription) {
    InputContentInfoCompat inputContentInfo = new InputContentInfoCompat(
            contentUri,
            new ClipDescription(imageDescription, new String[]{"image/gif"}));
    InputConnection inputConnection = getCurrentInputConnection();
    EditorInfo editorInfo = getCurrentInputEditorInfo();
    Int flags = 0;
    if (android.os.Build.VERSION.SDK_INT >= 25) {
        flags |= InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
    }
    InputConnectionCompat.commitContent(
            inputConnection, editorInfo, inputContentInfo, flags, opts);
}

作爲IME作者,您很可能必須實現自己的內容提供者才能響應內容URI請求。例外情況是,如果您的IME支持來自現有內容提供商的內容MediaStore。有關構建內容提供者的信息,請參閱CommitContent IME示例, Content Provider文檔和文件提供者 文檔。

如果您正在構建自己的內容提供商,我們建議您不要導出它(設置 android:導出 到false)。相反,啓用權限,通過設置在供應商給予 的android:grantUriPermission 來true。然後,當提交內容時,IME可以授予訪問內容URI的權限。有兩種方法可以做到這一點:

在Android 7.1(API Level 25)及更高版本上調用時commitContent(),請將flag參數設置爲INPUT_CONTENT_GRANT_READ_URI_PERMISSION。然後,InputContentInfo 應用程序接收的對象可以通過調用requestPermission() 和請求並釋放臨時讀取權限releasePermission()。

在Android 7.0(API級別24)及更低級別上,將INPUT_CONTENT_GRANT_READ_URI_PERMISSION 被忽略,因此您需要手動授予內容權限。一種方法是使用grantUriPermission(),但你可以實現你自己的機制來滿足你自己的需求。

有關權限授予的示例,請參閱CommitContent IME示例中的doCommitContent()方法。

要測試IME,請確保您的設備或模擬器具有能夠接收豐富內容的應用程序。您可以使用Android 7.1或更高版本中的Google Messenger應用程序,也可以安裝 CommitContent Sample App。

有關完整的代碼示例,請參閱CommitContent IME示例

Lastest Update:2018.04.24

聯繫我

QQ:94297366
微信打賞:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公衆號推薦:

【Touch&input 】圖像鍵盤支持(20)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章