あるAndroidアプリで積んだ経験 | モンスター・ラボTech/Designブログ

モンスター・ラボTech/Designブログ

株式会社モンスター・ラボのテクノロジスト、デザイナーによる持ち回りブログです。

初めまして。
入社二年目の中国人の謝です。
テクノロジストに所属しており、
主にAndroidアプリ、サイトなどの開発を担当しており、
最近はソーシャルゲームの苦戦をしております。

日本語がおかしいところもいっぱいあると思いますが、指摘していただければ幸いです。

今日は自作のAndroidアプリで積んだ経験を紹介したいと思います。

まずアプリの機能を簡単で紹介したいと思います。

一言といえば、場所、時間より音声モード、Wifi、BTを自動的に切替えてくれるアプリです。

ポイントは
1、バックグランドで安定的に実行できること
2、正確な場所をゲットする
3、電池消費を抑えること

僕も完璧に解決できていないと思いますが、恥ずかしながら自分の方法(正しいのかなぁ)を紹介したいと思います。

1、バックグランドで安定的に実行できること

アンドロイドの経験者ならすぐわかると思いますが、サービスで対応すれば解決できるでしょう。
僕も最初簡単だと思ってましたが、大変だった。

もっとも苦労したのは、「定期的に」GPS情報を取得することです。
定期的といえばタイマーはもっとも使われていますが、
このアプリでは使い物になりません。

アンドロイドは自動的にメモリを解放する仕組みになっている。
そして、端末のメモリ状況より、タイマーも解放されてしまうのです。
しかもいつ解放されたのか、全くわかりません。

自分の知っている限り、唯一の解決方法は「AlarmManager」を使うことです。
メモリいっぱいになっても、
電力が足りなくても、
端末はスリープになっても、
端末が死ぬまでAlarmManagerはちゃんと働きます。

2、正確の場所をゲットする
3、電池消費を抑えること

みなさんご存知だと思いますが、GPS情報取得するのはバッテリー消費がめちゃめちゃ激しいです。
普通にGoogleマップを3時間連続使って、耐えられる端末おそらくまたないでしょう。

アンドロイドは2種類のGPS情報を取得できます。
1、LocationManager.GPS_PROVIDER     衛星GPS情報取得
2、LocationManager.NETWORK_PROVIDER   ネットワークGPS情報取得

衛星GPSのメリット
1、比較的に正確なGPS情報取得できます。
  →自分の経験だと誤差20メートル以内。
   Googleマップと同じレベルのGPS情報取得できないようです。
   GoogleはGPS情報悪用されないために、わざと精度を下げたようです。
2、携帯の電波に依存しない
  →登山アプリなど

衛星GPSのデメリット
1、バッテリーの消費は激しい
2、屋内はほとんど取得できません

ネットワークGPSのメリット
1、バッテリーに優しい。
  →2分一回携帯回線GPSを取得しても、電池消費ほとんど変わりません。
2、屋内も取得可能
  →絶対とは言えないですが、基本的には問題ないです。
   ※取得できない高級ビルもあるらしい。(原因不明、ご存知の方がご教授ください!

ネットワークGPSのデメリット
1、ざっくりとしたGPS情報しか取得できません
  →地域により誤差も大きいです。
   僕が住んでいるところだと、誤差は70メートルがありますが、
   いろいろなところで試しましたが、遠くなっても150メートルぐらいです。
   ほかのユーザからのフィードバックよると、5KM以上もあるらしい。(端末のせいかなぁ...)

実装する際、まず衛星GPS情報取得してみて、10秒間取得できなかったら、ネットワークGPS情報を取得して、
それでも取得できなかったら、getLastKnownLocation(最後取得したGPS情報)を使うっという組み合わせでもいいかもしれません。

補足ですが、ネットワークGPS情報も2種類があります。
1、Wifi
2、基地局

Wifiに接続している場合は、もっとも正確なGPS情報取得することができます。
※WifiでGPS情報取得するのもバッテリーにすごく優しいですが、WifiOnにするだけで、パッテリーを食ってしまうのです。

以上、ご参考になれば幸いです。