スキップしてメイン コンテンツに移動

GeminiでAndroidアプリ作り

 AIによるバイブコーディングを試すべく、Android StudioとAntigravityでAndroidアプリを作ってみた。

今回の目的はRideWithGPSのルート情報を取得して、OruxMapsが理解できるgpxファイルを生成し、OruxMapsを起動するアプリを作ること。 


Android Studioでテンプレートを選び、空のプロジェクトを作る。

Antigravityでこれを開く。

JDKを入れろというが、Kotlinのコンパイルは普通のJDKでできるのか不明。Geminiに聞いたら動くらしいが、Android Studioのコンパイラを指定したほうがいいと思うので、JAVA_HOMEにAndroid StudioのJDKのパスを書いて何とかした。

生成コードの管理のため生成コードはgitに入れる。Android StudioからCommitする。


最初に日本語でやり取りすることを宣言すれば、以後日本語でやり取りできる。Geminiの思考中は英語のメッセージが出てくるが、まとめ終われば日本語で説明してくれる。


Agentモードで作りたいアプリを説明する。

Geminiが開発方針を説明してくれる。よくなければ変更を指示する。

作成を指示すれば方針に従って作ってくれる。

できたと言ったらAndroid Studioでビルドし、エラーが出たらエラーログをAntigravityにコピペすれば直してくれる。実行して死ぬようなときはLogcatのログ(システムログ)のException部分をコピペしてあげれば原因を調べて直してくれる。


RWGPSのAPIはOAuth認証して利用できるが、ログアウトしても再ログイン時にブラウザのCookieが効いてログイン画面にならない不具合が発生。


GeminiはログアウトAPIを探したり、WEBページのログアウトを呼んだり、あきらめたりしてイマイチ。結局こっちから提案してWebViewでOAuthを実行し、WebViewのセッションCookieを消してしまうことでログアウト後のログインができるようになった。このあたりはGemini任せではなく、一緒に解決した感じ。ただ、Geminiに聞いたらアプリ登録できないかも、ということで、Chrome custom tabsのやり方に戻した。


RWGPSは自身でgpxは作らず、JSONでルート情報を取得できる。geminiは緯度経度の情報が入っていると認識して、ちゃんとgpxを作る。キュー情報を変換してgpxに入れるのが肝で、もちろん変換内容はこちらが指示する必要があるが、テキストで書いた変換テーブルをコピペで示せばマッピング処理をちゃんと作ってくれる。

デバッグのために取得したルート情報や生成したgpxをファイルに保存しろと言えばDocumentフォルダに生成してくれたので、これを見ながら微調整。


ある程度できたところで、オフラインでも動くようにルート情報をキャッシュしろ、と言ったら、修正方針を示したので、確認してOKを出した。ちゃんとオフラインだとキャッシュしたルート情報でgpxを作るようになった。人間に指示していたら最初から言えよ、という案件。


無料プランだと半日ぐらいで利用上限になったのでClaude Sonnetに切り替えて続けたが、それも半日ぐらいで上限になったので、Gemini Proを申し込んだ。


apkを作ってみたら、16MBもあったので、なぜ?と聞いたら小さくする、とか言い出してAndroid R8とやらで最適化を始めた。これもなかなかビルドが通らなかったが、エラーを伝えるといろいろ直して何とか動くようになった。


マルチ言語対応したい。と言えば、ハードコードされた文字列を探してstrings.xmlを作る。以下の説明は全部英語だけど、指示は日本語でできるし、的確に理解している。


とりあえずやりたいことを言えばアイデアを出したり、やってくれる。こちらの実力も問われる感じ。本当に一行も書かずに動くアプリが作れるのは正直すごいと思う。

コメント

このブログの人気の投稿

ST-M310 シフトレバーのカバー開け

通勤用のCylva F24のリアディレイラーの変速の調子が悪いので調整した。完ぺきではないし、購入してからもうすぐ2年、走行距離は5000Kmは超えているはずなのでシフトケーブルも見てみたいと思い、シフターの分解をやってみる。 マニュアルはこちら。 https://si.shimano.com/pdfs/dm/DM-SL0001-09-JPN.pdf 20ページがALTUS、つまりST-M310のはず。 ねじを外せば太鼓部分を隠しているカバーが取れるように見えるけど、自分の場合二つ問題が。 一つ目はカバーがブレーキレバー部分にぶつかって取れない。Cylva F24についているシフターはブレーキレバーと一体型になっている。型番はよくわからない。マニュアルはシフターのみしか書いていないので、蓋が簡単に取れるように見えるけど、ブレーキ部分にぶつかって上には外れない。結局ブレーキ部分に当たる側をマイナスドライバーで側面の高さ分持ち上げた。 二つ目は爪の存在が説明されていない。マニュアルにはひっかけ部分の説明があるけど、そもそもインジケーターの裏が爪になっていてカバーが引っ掛かっている。この爪は真ん中に3mmぐらいの間があるので、ここにマイナスドライバを突っ込んでてこの原理で無理やり開ける必要がある。 カバーを外すとたぶんインジケーターが吹っ飛ぶけど、これは見れば直す方法はわかる。 で、中身を確認したけどきれいなもんでさびなどないし、ワイヤーの切れ・ほつれもなかった。

Ride with GPSで作成したルートのgpxファイルとOruxMapsの関係

Ride with GPSのAndroidアプリによるナビゲーションはOruxMapsと比較して告知がしつこくない。設定があまり多くないので仕方がないが、キューシートのポイントに対して一回しかアナウンスがない(もう一回ぐらいあるかな?)。またルート外に出た場合は地味な警告音と文字の通知しかない。 OruxMapsだと、ポイントの何メートル前で警告を出すか、最大何回出すか指定できる。街中だとうるさいぐらいしつこくアナウンスが出る。同様にルート外に出た場合も、しつこくしつこくアナウンスが出る。 たぶんブルベだとこれぐらいしつこい方がミスコースをなくすためにはいいと思う。 そうすると、Ride with GPSで作成したルートを使ってOruxMapsでナビゲーションするのがよい。 色々試した感じではGPXトラックのExportで、経路マーカーとしてPOIを含めると経路マーカーとしてキューを含めるをチェックすると、POIとキューがgpxのWayPointとしてExportされる。 キュー キューはWayPointとしてExportされる。RWGPSの「種類」として選んだものがnameに入り、注記に入れたものがdescとcmtに入る。   <wpt lon="139.5624979" lat="35.5408905">     <name>Straight</name>     <cmt>PC1</cmt>     <desc>PC1</desc>     <sym>Dot</sym>     <type>Dot</type>   </wpt>   POI POIの名前として入力したものはnameに入る。 <wpt lon="139.60360027326055" lat="35.565638161972615"> <name>フオトチェック</name> <sym>Dot</sym> <type>Dot</type> ...

gpxデータのiGPSPORTアプリへの転送

メインナビとしてAndroidのOruxMapsを使っているが、バックアップはiGS630のナビ機能を使っている。通常はRide With GPSでルートを引いて、GPXファイルとしてダウンロードし、OruxMaps用にコンバートしてGoogle Driveに置き、AndroidのGoogle Drive経由でOruxMapsに入れつつ、同じくiPhoneのGoogle Drive経由でiGPSPORTアプリで読み込み、PCやゴールデータを追加してiGS630に転送している。 来週のBRM224に向けてiGPSPORTに読み込ませようとするとファイルがグレイになって選べない。昔のファイルだけアイコンが付いていて選べる。ファイルを開くとCreatorがStravaになっていたので、これをコピペしてみたけど変わらず。 ためしにiPhoneのRide With GPSアプリでGPXでエクスポートし、共有するを選んでファイルに保存するとファイルにアイコンが付いて、iGPSPORTアプリで選べるようになった 拡張子とは別のファイル種別を示す情報でも付けているのか? 理由はよくわからないが、いったんよしとする。