ItMap(android)
位置情報を記録しリアルタイムで指定されたサーバーに送信する。
概要
ItMap(android)は、現在の位置情報を外部サーバのURLにPOSTメソッドで送信するアプリである。プログラムはGitHubで公開している。位置情報の送信先URLは、設定のServerとAccountで指定し、Server+Account+'.json'と連結される。例として、Serverが'https://www.example.com/foo/'で、Accountが'bar'であれば、位置情報の送信先URLは、'https://www.example.com/foo/bar.json'となる。また、アプリケーション起動時に全てのログと24時間が経過した位置記録は削除される。
(Version UP) 設定を変更することで、位置記録の外部サーバ送信を禁止することや、起動時のデータ自動削除を行わないようにすることが出来る。この場合、一般的なGPSログアプリと同様の利用法となる。
POST仕様
JSONで以下の形式である。
- {
- "keyword": "(some keyword)",
- "message": "(your message)",
- "coordinate": [
- {
- "timestamp": 999.999,
- "longitude": 999.999,
- "latitude": 999.999,
- "altitude": 999.999
- },
- ...
- ]
- }
keywordとmessageはnullableであり、利用のされ方はサーバ依存である。標準的には、keywordは認証に使われ、acountのパスワードとして機能する。 messageはaccountに関連するなんらかの通知文である。 coordinateはaccountに関連する位置情報の配列で、それぞれの要素は4つの座標値を持つオブジェクトである。 timestampはUNIX時間(エポック秒)、 longitudeは経度(東経が正)、 latitudeは緯度(北緯が正)、 altitudeは高度(メートル)で、座標値は全て実数(double型で処理される)であり、altitudeのみnullableである。
使い方
基本画面

画面内の[ON/OFF]ボタンで位置情報の記録を開始/終了できる。記録開始時に位置情報取得の権限がない場合、通知メッセージが表示されるので、通知をタップして(もしくは設定アプリから直接)手動で権限を追加する必要がある。権限設定後、一旦記録を終了させてから、再度開始すること。
[Log|Map|Record]のラジオボタンは画面に表示する内容を切り替える。画像ではRecordが選択されており、 Record Historyに位置情報の記録状況が表示されている。記録される位置情報データは、左から時刻、経度、緯度、高度である。時刻は現地時間、経度と緯度は、東経と北緯が正で西経と南緯が負となっている。各行最左のチェックボックスはアップロードフラグで、位置情報データがサーバにアップロードされるとチェックされる。なお、画面上部の「Total」「Elevation」項目は未実装です。 (Version Up) Total項目のTimeは記録開始からの経過時間、 Distanceは総移動距離が表示される。 Elevation項目は順に、Minが最低標高、Maxが最高標高、 Gainが累積高度上昇量、Lossが累積高度下降量となっている。
Log表示は主に開発者向けである。エラーやデバッグ情報が表示されるがユーザにはあまり関係ない。
Map表示では最後にサーバにアップロードされた地点が地図上に表示されるが、実際には設定で指定したServerとAccountを元に構成された URL(Server+Account+'.html')にアクセスした結果である。すなわち、位置情報を受けつける(位置情報をアップロードされる)サーバは、 Server+Account+'.json'にPOSTされたデータから地図ページ(HTML)を作成し、 Server+Account+'.html'をGETされた時に生成された地図ページを返す必要がある。
(Version Up) タイトルバーのメニューは、順に「基本設定(アイコン)」、「メッセージ設定(アイコン)」、「共有(Share)」「削除(Delete)」「保護区域の設定(Set Private Area)」である。「基本設定」は各種設定値の変更を行うが詳細は次節で説明する。「メッセージ設定」は「設定」の一部であるが、「設定」が主に初期設定で一度だけ行えばよいのに対して、メッセージは頻繁に変更する可能性が高いため分離している。「共有」は「URL共有(Share URL)」と「記録共有(Share Record)」のサブメニューを持つ。前者は現在地の地図ページを表示するURL(Server+Account+'.html')を他アプリと共有する。 SMSやSNS、メールなどと共有し、友人などに現在地を知らせるのに使えるだろう。後者は記録された位置情報を(サーバへのアップロードとは無関係に)他アプリと共有する。 Google Driveや適当なファイルマネージャと共有すれば実質的な保存として使えるだろう。位置情報データはGeoTEXT形式となりここでGPXに変換できる。「削除」は「ログ削除(Delete Log)」と「記録削除(Delete Record)」のサブメニューを持ち、それぞれ、ログデータ、或いは、位置情報データを直ちに削除する。ただし、記録中の削除は禁止しているので、一旦、記録を終了させること。「保護区域の設定(Set Private Area)」では、位置情報の記録を禁止する区間を設定できるが詳細は次々節で説明する
基本設定画面

画像は「基本設定」で表示されるダイアログである。設定項目は以下の通り。
- Server
- :位置情報をアップロードするサーバの基準URL。
- :実際に位置情報がPOSTされるURLは、下のAccountと連結されたServer+Account+'.json'である
- Account
- :データをアップロードするアカウント。
- :デフォルトではランダムなUUID文字列が設定される。
- :アップロードされる位置情報はアカウント毎に記録される。
- keyword
- :意味はサーバ依存。
- :デフォルトではランダムなUUID文字列が設定される。
- :www.atte.ccでは混信を防ぐパスワードとして利用している。
- Record Timing
- :何分毎に位置情報を記録するか。
- Upload Timing
- :何回位置情報を記録する度にサーバにアップロードするか。
- :0にするとサーバへのアップロードを行わない。
- Auto Clean Data
- :チェックすると起動時に全てのログと24時間が経過した位置情報は削除される。
- Auto Follow Record
- :チェックすると位置情報を記録する度に自動で最上部までスクロールする。
Record Timingが3で、Upload Timingが5であれば、 3分ごとに位置情報を記録し、 5回位置情報を記録するごとにアップロードするので、 15分ごとに5回分の位置情報をまとめてサーバに送信することになる。 ItMapの通信量は元々小さいが、さらに絞りたいのであれば大きめに設定すれば良い。例外は記録開始直後の初回位置情報のアップロードで、 Upload Timingが0でない限り、即座にサーバとの連携が行なわれる。よって、位置記録を一旦終了(OFF)させて、すぐに開始(ON)すれば、 Upload Timingを待たずに強制的に未アップロードの位置情報をアップロード済にできる。 (ただし、www.atte.ccではサーバ側で1分以内の連続アップロードを禁止している。)
この他、メッセージ設定ダイアログで、Messageを設定することができる。ここで設定されたメッセージはサーバとの次回通信時に送信される。 www.atte.ccでは、現在地を表示する地図ページの吹き出しに書き込まれる文言として利用している。
保護区域の設定画面

画像は「保護区域の設定」で表示されるダイアログである。自宅など記録されると困るエリアを設定しておけば役立つであろう。
- Radius (metre)
- :記録を禁止するエリアの半径 (メートル単位)
- :0であれば保護区域は設定されない(記録は禁止されない)。
- Latitude (degree)
- :記録を禁止するエリアの中心緯度 (度単位、北緯が正)
- Longitude (degree)
- :記録を禁止するエリアの中心経度 (度単位、東経が正)
- FETCH LOCATION (ボタン)
- :現在地の緯度経度を設定する。
- :現在地を取得できない場合は、 Google Map などで一度現在地を確認してから再試行してください。
- CHECK LOCATION (ボタン)
- :設定されている緯度経度を地図アプリを起動して確認する。
そもそも、自宅や職場など個人情報に当たるエリアでは位置記録はとらない方がよい。うっかり、位置記録を終了する(OFFにする)のを忘れた場合の安全弁としての機能である。
BUG or TODO
DB(Realm)へのアクセスはUIスレッドで実行している。個々の処理が軽く、ほぼ、Foreground Service(UIがない)での処理であるから、「問題無し」と考えているが、気になる諸兄は非同期IOに改変してもいいだろう。簡易的には、DB(Realm)アクセスを全てRealm.executeTransactionAsyncに置き代えてやれば実現できるが、厳密な実行順序制御を実現するのは難しいかもしれない。わずかな時間差で executeTransactionAsync(1)と executeTransactionAsync(2)が続けて生起した場合、非同期だと(2)が先に実行される可能性がある。ただし、そんなこと(ほぼ同時実行)は、そもそも稀(設定できる記録間隔は最低1分以上)な上、少々順序が前後したところで問題になる状況はないとも言える。
Tiny Location Recorder

余計なアップロード機能なんていらない。記録だけできれば良いということもあるので更に機能を限定した。世にあるGPSロガーを使った方が便利だと思うけど、 Android10におけるリファレンス実装になればいいかなと思ってこちらも公開する。本当にシンプル。記録してるだけ。保存も面倒なので共有で済ませている。前章で述べたように、記録されたデータは、 Google Driveとか適当なFile Managerとかと共有すれば保存できる。あと、ItMapと同様、アプリの設定から手動で「位置情報権限」を追加する必要有。記録開始時に権限がなければ通知が出るので、その通知をタップすればシステムの設定画面が開く。
右記画像が基本画面。 [ON/OFF]ボタンで現在地の記録開始と終了。その横の3つのボタンは左から[共有][削除][設定]となる。共有で記録された位置情報を保存。削除は記録された位置情報をすべて削除。設定のRecord Timingで位置情報の記録間隔を秒単位で設定できる(最低でも10秒以上)。ただし、記録間隔は目安で必ずしも設定通りの間隔で記録されるわけではない。 Follow Recordをチェックすると、記録の度に先頭行に自動的にスクロールする。