Android 開発初心者がアプリ開発をしてみた体験記です。なお、作成物はストア公開はしてないです
# やったこと
- Kotlin で Activity 三つのアプリ作成
- Jsoup を利用したウェブページのロード、DOM 操作
- TextToSpeech を利用した読み上げ機能
ソースコードはこちら: https://github.com/negito6/WikipediaSpeech-Android
# 動機と機能
Android の読み上げ機能を使ってウェブページ全体を読み上げようとすると、読み上げにはちょっと邪魔な文字列が沢山あります。特に Wikipedia でいうと、メニューにある各種リンクのテキストや、細かい数字が載った表などです。
また、(端末によってなのか知らないのですが) Chrome 上で「全て選択」をすると選択範囲が変更できないため、読み上げアプリにコピペする文字列として長い文章を選択しづらいです。
そこで、Wikipedia のページの文字列のうち、読んでほしいところだけを読み上げてくれるアプリを自作することに。
# 自分の Android 習熟度
(自己紹介みたいな話。)
仕事で数回、会社で出しているアプリに機能追加の仕事をしたことがあります。Android の初心者向けの本はバージョン3くらいの時代にさらっと読んだことがあるのですが、借り物の本だったし、概念を掴んだ程度。
いちからコードを作ってみたのは、勉強用に、activity のtemplate をちょっといじっただけのアプリをビルドしたことはありました。
それくらいの初心者感です。
# 技術的なメモ(感想)
## Android Studio
Android Studio をインストールしたのは通算で五回目くらいだと思うのですが、毎回変わっている気がしていつも困ります。今回はAVD Manager の場所が変わっていて、見つけるのに割と時間がかかりました。アプリ開発を始めるには、エミュレータのインストール、gradle sync、manifest など、相変わらず初心者にはハードルが高いなあと思います。
また、以前からLayout のGUI エディタがずっと苦手で、今回は新規アプリだし頑張ろうと思ってました。しかし、またしても挫折してしまいました。
## 言語 (Kotlin)
現在の仕事でも使っているKotlinを採用。コードは少ないし書きやすいと思います。Android に関する技術ブログなどは当然 Java がサンプルになっているものがまだまだ多いので、プログラミング学び始めで Android 開発をする人は苦労しそうだなーと。
公式ドキュメントやググって出てきた Java のコードをはっつけるときは、当然 IDE の変換機能を使います。単に貼り付けるとよくエラーが出ますが、そのときに、IDE の変換能力の問題ではないと強く信じることが大切だと学びました。なぜかというと、よく考えれば、名前の間違いか、挿入場所を間違えてることがほとんどだからです。
## Jsoup
適当にググって出てきたので使いました。なので、定番かどうかは分からないです。
ページのロードも簡単にかけたし、DOM 操作も JavaScript ライクに簡単に書けたので良かったです。
## TextToSpeech
読み上げを Start させてから状態変化によって呼ばれる callback を登録することができます。
エラー時に呼ばれる onError
が二つあって、 errorCode
が受け取れる方と受け取れない方があるのですが、なぜか errorCode
が結局受け取れず、ここはまだうまくいっていません。
実装当初はエラーが発生して読み上げてくれないことがたくさん起きたのですが、おそらく読み上げできない文字列を含んでるんだろうと予測し、行を句点でひたすら分割することで乗り気っています。分解すると
- 読み上げたい文章を文字列の配列にして、一文ずつ渡す
- 現在読んでいる文のインデックスを外の変数に保持
- TextToSpeech に登録した finish のcallback がインデックスを一進める
- そのインデックスの文をまた読み上げる
ということをしています。どっかで詰まりそうなんですが、なぜか今のところきちんと回っています。気づいていないだけかも。
その他
Wikipedia の HTML
今回のアプリを作った視点からいうと、HTML の構造化が思ったよりもされてなくて面倒でした。MediaWiki? の何かがアップデートされてらすぐにこのアプリは動かなくなってしまいそうです。まあ、こんな用途に向けて作ってないと思うので、文句言う筋合いはありません。
## ストア公開観点
個人的にはアイコンが一番のハードルなのでやってないです。加えてデザインとか、複数の Android バージョン対応とか。個人開発で公開までやる人は尊敬します。