🐬

Android のキーボードアプリを作った (Kotlin)

2023/04/12に公開

作成したもの (PlayStore に飛びます)

先日、メモアプリを作成してマークダウンの補助機能をキーボード内に埋め込みたいと思いました。色々調べた結果1からキーボードを作成しなければ自分のしたい事ができなかった為 Just for Fun で作成してみました。

Android Develper のインプットメソッドを作成するのページ

現在の selection の位置 (start と end), composingText と start の位置を onUpdateCursorAnchorInfo で取得する方法

class MarkdownIME: InputMethodService() {

	override fun onCreateInputView(): View {
		return layoutInflater.inflate(R.layout.main_layout, null).apply{
			currentInputConnection.requestCursorUpdates(InputConnection.CURSOR_UPDATE_MONITOR)
		}
	
	}
	
	override fun onUpdateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo?) {
		Log.d("onUpdateCursorAnchorInfo: ",info.toString())
	}

}

タップして Selection の位置を変えたときを取得する際に必要となりました。

Enter キーの挙動を EditorInfo の Type で変える方法

when(val type = currentInputEditorInfo.imeOptions and EditorInfo.IME_MASK_ACTION){
		EditorInfo.TYPE_CLASS_NUMBER, EditorInfo.TYPE_CLASS_PHONE, EditorInfo.TYPE_CLASS_DATETIME ->{
		    currentInputConnection.performEditorAction(type)
		}
		else ->{
		    currentInputConnection.apply {
			sendKeyEvent(
			    KeyEvent(
				KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER
			    )
			)
		    }
		}
	    }

EditorInfo.TYPE_CLASS_NUMBER の EditText を使用している際, KeyEvent.KEYCODE_ENTER では入力を確定することができなかった。

かな漢字変換は OpenWnn を使用させて頂きました。使用した例

override fun onStartInput(attribute: EditorInfo?, restarting: Boolean) {
        super.onStartInput(attribute, restarting)
	val openWnnEngineJAJP = OpenWnnEngineJAJP(
                "${context.filesDir.path}/writableJAJP.dic"
            )
	val composingText = ComposingText()
	openWnnEngineJAJP.apply {
                init()
                setDictionary(0)
                setKeyboardType(1)
            }
	val suggestions = mutableListOf<String>() 
	composingText.insertStrSegment(ComposingText.LAYER0,ComposingText.LAYER1, StrSegment("変換したい文字"))
	openWnnEngineJAJP.convert(composingText)
	for (i in 0 until text.size(ComposingText.LAYER2)) {
		// 文節のその他の候補を取得できるようにします。
		if (0 < openWnnEngineJAJP.makeCandidateListOf(i)) {
		    // 文節の変換候補を取得します。
		    var word: WnnWord?
		    while (openWnnEngineJAJP.nextCandidate.also { word = it } != null) {
			suggestions.add(word?.candidate ?: "")
		    }
		}
	    }
}

参考にしたサイト

OpenWnn

Discussion