Androidアプリ公開しました!
かつてより作ってみたいな〜と思っていたAndroidアプリをGooglePlayに製品版を公開しました!
WebViewで作られていたソシャゲを担当していた時、ネイティブの機能を使ってあれやりたいこれやりたいと思ったり、このJavascriptはどういう仕組で動いているんだ?と疑問に感じていたので、なんでもいいからスマホアプリを自分で手がけたいと悶々と思っていました。
まぁ、それまでアプリプラットフォームチームのコードを読んだりもしていたのですが、そもそも今の組織に入ったとき、流行り始めているスマホアプリを開発したかったという思いもあって、6年越しに一通り自分で管理できる機会に恵まれました。
作ったアプリは、HTML5の canvas
で生成した画像をスマホのストレージに保存する機能しか持たない簡単なアプリですが、なかなかはまりました。お遊びでアプリは作っていたのですが、ちょっと込み入ったことをすると途端にはまるのはいつまで経っても変わらないな。。
普通のWebViewのアンカーリンク(A要素)から画像ファイルをダウンロードするのであれば、特にはまらなかったかもしれませんが、今回はbase64エンコードされた文字列をアプリで受け取って、画像ファイルにデコードして保存という流れです。というのも、WebView上の canvas
に文字やスタンプ画像を好きに配置して、 toDataURL()
メソッドで data:URI
を生成するためです。
この場合、 DownloadListener
で受け取れるのか、 WebViewClient.shouldOverrideUrlLoading(WebView view, String url)
で受け取れるのか挙動が分からずに色々悩みました。素人同然のため、API Levelで挙動が違うのか、端末依存なのか、WebViewのバージョンで違うのかが全く分からず、なんだかできたと思ったら他の端末で動かない、それを直したら他で動かないみたいなモグラたたき状態に陥っていました。
結局、この記事に行き着き、 DownloadListener
ではなく shouldOverrideUrlLoading
でもないブラウザのセキュリティの更新が原因だったみたいでした。 JavascriptInterface
を用意して、 data:URI
をWebViewのJSから渡してもらう方法に軌道修正して期待通りの動きにできました。なんとなくアンカーリンク(A要素)だし初アプリ実装だから、王道のメソッドで受け取りたかったんだろうなと自分にかかったバイアスの強さを感じました。
だから端末によってイベントをキャッチできたりできなかったりしたんだろうなぁと振り返って思いました。他にもはまったポイントや知り得たことを忘れないように書いておこう。
- 端末の権限の取り方
- Android 7.0以降は
onRequestPermissionsResult
をOverrideしてユーザの操作をハンドリングする - これをOverrideしていないと権限無い状態で先の処理が走ってしまってアプリが落ちる
- Android 7.0以降は
ProgressDialog
の実装方法Thread
で非同期にしておかないとActivity
で管理?していないダイアログになってアプリが落ちる
- JSのAlertみたいなダイアログの実装方法
AlertDialog.Builder
でボタンの挙動だったり表示文字をセットできる
- 画面回転した場合、WebView
の更新処理が走る
restoreState()
でsavedInstanceState
を保存しておくメソッドをOverrideしておく
- Webアプリじゃないので、戻るボタンを押されたときの挙動を実装しておく
onKeyDown()
をOverrideして実装しておかないと、トップページに戻った時に再度戻るボタンを押したら別のページに遷移したりする- この挙動がネイティブアプリっぽくないから、適切に押下を無視するとか
finish()
とかを実装しておく
- アプリからWebViewのHTMLを変えたい
onPageFinished()
とかをOverrideしてloadUrl()
でJSを即時実行させると動く
- リファレンス機は必要
- エミュレータで確認していたのですが、どうやらWebViewの更新が追いついていなかったのかな?動かなかった。。
- Nexux5xも息が長いけど、公式リファレンス実機の確認は絶対やったほうがいい
実装はとても楽しかったので、最後にアプリの紹介をば。 これは所属する会社のお産合宿に誘われたのがきっかけで始まったことでした。
さらっと canvas
で画像ファイルを・・・と話しましたが、それはアイドルのコンサートなんかで光らせるキングブレードというペンライトに装飾をするための画像ファイルです。キングブレードの内紙にバッチリ合う画像ファイルをコンビニで印刷できる(コンサートへ向かう最中でも推しメン用にカスタマイズできる)ことが売りです。
そちら方面はまったく詳しくないのですが、 @souseiji さんや @_mmmix さんの話を聞く内にチャンスなのではないかと感じて参戦させていただいた次第です。
途中、まったくわからないキーワードに出会ったり、自分用のキングブレード買ったり、帰りにスターマリーのコンサートに連れて行ってもらったりと、開発以外にも色々初体験が多い期間で楽しかったです。
今回は、金銭的にも期間的にもAndroidアプリに絞って作りましたが、会社の人たちはiPhone率が高いので、空いた時間にちょびちょび作ってしれっとiOSアプリも公開しとこうかな〜