
DATA BOTTLE
DATA BOTTLE — データを「液体」として見るAndroidアプリを作りました スマートフォンの中には、いろいろな「量」があります。 バッテリー残量、ストレージ使用量、メモリ使用量、モバイルデータ通信量。 普段はこれらを数字やバーグラフで見ていますが、ふと思いました。 これを全部、液体として見せたら面白いんじゃないか。 そこから作り始めたのが、Androidアプリ DATA BOTTLE です。 DATA BOTTLEでは、スマートフォンのデータを「ボトルの中に入った液体」として可視化します。 ただし、本物の液体をリアルに描画しているわけではありません。 画面を構成しているのは、高密度に並べた小さな単色ドットです。 ボトルの輪郭もドット。 空いている部分もドット。 そして、明るく光っているドットが「データ」です。 例えばストレージ使用率が41%なら、ボトルの下から約41%までデータが溜まります。 数字を見る前に、 「これくらい入っている」 という量感が分かることを目指しました。 スマートフォンを傾けると、データが揺れる DATA BOTTLEの一番大きな特徴は、端末の傾きセンサーを使っていることです。 スマートフォンを左右に傾けると、ボトルの中のデータも重力に反応します。 液面が傾き、少し遅れて追従し、動きを止めると波が残って、徐々に静まります。 途中からは単純なサイン波だけではなく、弱い第二波や微妙な位相の変化も加えました。 そのため、毎回まったく同じ揺れ方にはなりません。 一方で、端末が静止したときは逆です。 波や細かなセンサーノイズをすべて消して、液面を最も近いドット行へ丸めます。 その結果、静止時には完全に水平な一本の液面へ戻ります。 動いているときは有機的。 止まったときはデジタルらしく完璧。 この切り替わりが、DATA BOTTLEでかなり気に入っている部分です。 複数の「ボトル」を持てる 現在は、バッテリー、ストレージ、メモリ、モバイルデータ、画面輝度、音量などをボトルとして表示できます。 左右にスワイプすると、別のボトルへ切り替わります。 設定画面では表示するボトルと非表示にするボトルを選択でき、並び順も変更できます。 また、ホーム画面用のウィジェットも用意しています。 アプリ本体では液体が動き、ウィジェットでは静止したDATA BOTTLEを見る、という役割分担です。 MOBILE DATAは100%を超えても終わらない 月間モバイルデータ通信量は、DATA BOTTLEとの相性が特に良いデータでした。 例えば契約容量が20GBなら、20GBでボトルが100%になります。 では21GB使ったらどうするのか。 単純に「105%」と表示するのではなく、別の色のデータが底からもう一度溜まり始めるようにしました。 115%なら、ボトルの下15%が超過色になります。 180%なら、下80%が超過色。 「契約容量を超えた」という状態を、数字ではなく別の液体として見る仕組みです。 OpenAI APIもボトルに DATA BOTTLEには OPENAI API ボトルも追加しました。 BYOK(Bring Your Own Key)方式でOpenAIのAdmin API keyを設定すると、当月のAPI利用料金をボトルとして表示できます。 例えば月額上限を20ドルに設定していて、8.4ドル利用していれば42%。 こちらも100%を超えると、MOBILE DATAと同じように別色が底から再び溜まります。 APIキーはソースコードへ埋め込まず、Android Keystoreを利用して端末内で保護するようにしています。 最初は逆でした 実は開発途中では、データが入っている部分と空いている部分が逆になっていました。 文字も暗くて読みにくく、 「データ=液体」 という一番大事なルールが画面から伝わっていませんでした。 そこから、明るいドットをデータに統一し、ボトル輪郭を暗くし、文字の階層を整理しました。 さらに、 「水面が直線すぎてゲージに見える」 「静止しているのに少しギザギザしている」 といった部分を一つずつ修正。 結果として、現在のv0.1.7では、 動かすと液体、止めると完全なドット水平面 というDATA BOTTLE独自の表現になりました。 GitHubで公開しました DATA BOTTLEはGitHubでソースコードを公開しています。 Android用の署名済みRelease APKも用意しました。 まだv0.1.7なので、これから調整したい部分はたくさんあります。 ただ、最初に考えていた、 「データを見る」のではなく、「データの量を感じる」 というところには、かなり近づいてきました。 普通なら数字やグラフで表示される情報を、別の物質として表現する。 DATA BOTTLEでは、データを液体にしました。 スマートフォンを傾けると、そのデータが揺れます。 こういう、実用アプリとデジタルオブジェの間にあるものを、これからも作っていきたいと思います。 DATA BOTTLE v0.1.7 Data becomes liquid. Androidで必要になる権限について DATA BOTTLEは、できるだけ余計なAndroid権限を要求しない設計にしています。現在アプリがManifestで宣言しているのは、インターネット接続と使用状況へのアクセスの2つです。加速度センサーも使用しますが、これはAndroidの通常の実行時権限ではなく、端末機能として利用しています。 インターネットアクセス android.permission.INTERNET OPENAI APIボトルでOpenAIのAPIへアクセスするために使用します。 バッテリー、ストレージ、メモリなど、端末内だけで取得できるデータを見るためにインターネット通信を行う必要はありません。 OpenAI APIを使用しない場合でもManifest上ではINTERNET権限が含まれていますが、これはAndroidではインストール時に個別確認ダイアログが表示される「危険な権限」ではありません。 「使用状況へのアクセス」 android.permission.PACKAGE_USAGE_STATS DATA BOTTLEの MOBILE DATA ボトルで、端末全体のモバイル通信量を取得するために必要になります。DATA BOTTLEではAndroidの NetworkStatsManager を利用します。 Androidでは、アプリが端末全体の通信量を取得する場合、Manifestに権限を書くだけでは利用できません。ユーザー自身がAndroidの設定画面から、そのアプリに**「使用状況へのアクセス」**を許可する必要があります。Android公式ドキュメントでも、端末全体のNetworkStats取得には PACKAGE_USAGE_STATS を宣言し、ユーザーが設定画面から許可する方式とされています。 DATA BOTTLEでは、 SET → MOBILE DATA → GRANT からAndroidの設定画面を開き、そこで DATA BOTTLEを許可します。 これはカメラや位置情報のような通常のポップアップ型権限とは少し違い、Androidの「特別なアクセス」に近い扱いです。 許可しない場合でも、DATA BOTTLEそのものは使用できます。MOBILE DATAの自動取得だけが利用できなくなります。 加速度センサー DATA BOTTLEでは、スマートフォンを傾けたときにボトル内の液体を重力方向へ動かすため、端末の加速度センサーを使用します。 ただし、現在のManifestでは加速度センサーを android.hardware.sensor.accelerometer という端末機能として任意指定しているだけで、ユーザーに追加の権限許可を求めません。また required="false" のため、加速度センサーがない端末でもインストール自体を禁止しない設計です。 その他のボトル BATTERY / STORAGE / MEMORY / BRIGHTNESS / VOLUME の表示については、現在のDATA BOTTLEではカメラ、マイク、位置情報、連絡先、SMS、写真ライブラリなどの権限を要求していません。現在のManifestにも、それらの権限宣言はありません。 STORAGEについても、Androidのストレージ統計APIには権限なしで取得できる情報があり、他アプリやユーザー単位の詳細情報を取得する場合にのみ使用状況アクセスが必要になる仕組みがあります。 OPENAI APIのBYOKについて OPENAI APIボトルを使う場合は、ユーザー自身のAPIキーを設定する BYOK(Bring Your Own Key) 方式です。 APIキーをAndroidの権限として取得するわけではありません。ユーザーが自分で入力したキーを利用し、DATA BOTTLEからOpenAIへ通信します。 そのため、Android側で新たにカメラやストレージなどへのアクセスを許可する必要はありません。