スマホのソフトウェアキーボードと絵文字
ガラケー時代の名残の"あの絵文字機能"は、スマホ時代にも健在で、おそらく国内で発売されているどのスマホを買っても、キャリアごとの絵文字が入力できるような機能が、ソフトウェアキーボードに搭載されています。
Google 日本語入力先生も、地味に絵文字対応していたりして、Nexus4だと何故か絵文字が画面上に表示されませんが、入力自体はできるようになっています。
標準では入力制限がかかっている
特になにもしていないと、おおよそキャリアメールクライアント以外では、ソフトウェアキーボードの絵文字機能は使えないようになります。
なので、Google 日本語入力先生なんかでは、記号ボタンを押した後の画面で、絵文字ボタンはグレーアウトして押せないはずです。
ユーザが自由に絵文字増やせる端末も
で、世の中には面白いスマホ端末が発売されていて、SoftBank Mobile から京セラさんが出している HoneyBee という前衛的な端末では、写真にとったものを絵文字にできるという愉快な機能(オリジナルマイ絵文字)が搭載されています。
さらにおもしろいことに、この HoneyBee に載ってるソフトウェアキーボードは、上記の入力制限なく、ところかまわず絵文字が入力できるように作られているようで、他の端末では絵文字入力できない EditText にも、HoneyBee なら絵文字入力できます。
一体どんな文字コード体系で扱われるのかは知りませんが、メールに添付できたりもするようです。デコメ的な扱われ方なんでしょうか。いずれにしても、何の気なしにオリジナルマイ絵文字を自分のアプリに入力されてしまうと、何が起こるんです?
undef
絵文字を入力できるようにしよう
やりかたは、本当は 2 つあるはずなんですが、動かしてもフレームワーク側で弾かれてぬるぽになるので、実質 1 つです。
xml で頑張る
実は、しれっと Android のリソースの中には、<input-extras>
なるものがあって、この中に、Bundle にデータを打ち込む要領で、android:name
属性とandroid:value
属性をもつ<extras>
要素をぶら下げると、Bundle
に<extras>
の中身が入ってるようなものが、静的リソースとして定義できるよって書いてあります。
で、そのリソースをres/xml
ディレクトリに放り込んで、そのBundle
を使いたいEditText
の属性に、android:editorExtras="@xml/emoji_extras"
みたいに書いておくと、指定したリソースで定義したBundle
がEditText
に放り込まれ、オプショナルな機能がいじれるようになります、って書いてあります。
Google 先生に聞いてもそれなりの情報は出てきたりはするので、どっかで使っている人は居るんでしょう。実際、絵文字用に、以下の様な <input-extras>
のリソースがサンプルとして作られていたりします。
<input-extras xmlns:android="http://schemas.android.com/apk/res/android">
<extra android:name="allowEmoji" android:value="true"/>
</input-extras>
<EditText
...
android:editorExtras="@xml/emoji_extras"
... />
動かすと落ちます。
知らない xml の要素を検出したとかで、ぬるぽで死にます。
同じように困っている人がいるので、現時点ではこれは正しいやりかたではないようです。
コードで何とかする
で、どうするかというと、Java で何とかします。
EditText edit = (EditText) findViewById(R.id.edit);
Bundle extras = edit.getInputExtras(true);
if (extras != null) {
extras.putBoolean("allowEmoji", true);
extras.putBoolean("allowDecoEmoji", true); // デコメ的なやーつもあるらしい
}
これで絵文字ボタンが有効化されました(ソフトウェアキーボードの種類によってはガン無視するやつも居るかもしれません)。
ヒャッハー!これでガラケー時代の絵文字が俺達のアプリでも使えるんだぜ!
って思うんですが、なんか使えませんでした。絵文字は残念なことに、真っ白。一応、入力自体はできているようで、謎の空白が詰め込まれていき、キャレットだけが静かに動きます。これは Nexus 端末だからなのでしょうか…