位置情報取得に関する覚え書き、その2

公開日: : 最終更新日:2014/01/26 Android

以前、【Androidアプリ開発】位置情報取得に関する覚え書き を書いたが、試行錯誤を続ける中で変更した部分があるのでソースコード付きで補足しておく。

LocationManager を生成するタイミング

LocationManager は onCreate にて生成し、フィールドに保持しておく。

private LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
}

LocationManager#requestLocationUpdates のタイミング

GPS、WiFi に関わらず、onResumeLocationManager#requestLocationUpdates を実行しておく。

@Override
public void onResume() {
    super.onResume();
    if(locationManager != null) {
        if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        } else {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        }
    }
}

プロバイダは、GPS が有効であれば GPS を使い、そうでなければネットワークを使うようにしている。

確認した限りだが、LocationManager#getBestProvider を実行すると、プロバイダは常に LocationManager.NETWORK_PROVIDER になってしまうため↑のような確認している。

Location の取得

Location も、まずは GPS から取得してみて、取得できなかったらネットワークから取得するようにした。

Location location = getLocationByGPS();
if(location == null) {
    location = getLocationByNetwork();
}
if(location == null) {
    // Location が取得できなかった旨の Toast を出力するとか
} else {
    onLocationChanged(location);
}
private Location getLocationByGPS() {
    if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        return locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    }
    return null;
}
private Location getLocationByNetwork() {
    if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }
    return null;
}

取得した Location オブジェクトはフィールドに保持

上記の getLocationByGPSgetLocationByNetwork で取得した Location オブジェクトと LocationListener#onLocationChanged の引数で渡される Location オブジェクトはフィールドに保持しておいた。

「前回取得した Location と比較して。。。」みたいなことを思ったのだが、今のところその必要はないようだ。

ひとまずこれで様子を見てみる

今のところこの実装方法でうまくいっている。

画面を開いた瞬間に位置情報を測位しているが、タイミングによっては Location が取れない(Null が返ってくる)場合もある。その場合でも、5秒も経たないうちに測位できる。「これじゃダメ」って言われたら、また対策を考えよう。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

初めてのアンドロイドアプリ開発振り返り

始めてのアンドロイドアプリ開発が落ち着きをみせてきた。まだ熱が冷めないうちに簡単に振り返っておく。

記事を読む

icatch-bar_7241902618_mini

Android アプリで ActionBar の背景色を変更する方法

Android 3.x 系から追加された ActionBar。 開発中の Android アプリで

記事を読む

no image

WebView からデフォルトブラウザを開く

WebView に表示されているリンクは WebView ではなくデフォルトブラウザで開きたい、とい

記事を読む

icatch-error_9849183645_mini

Android の非同期処理を行う Loader の起動方法

これ、ボクの完全な思い違いだったのですが、非同期処理を行うクラスの呼び出しは Activity か

記事を読む

no image

AlertDialog がキャンセルされたときに処理を行うスニペット

AlertDialog のスニペット。キャンセル時のリスナーを Gist に登録。 new Al

記事を読む

no image

位置情報取得に関する覚え書き

思うように最新の位置情報を取得できなかったが、試行錯誤した結果「とりあえず大丈夫かな」って段階まで持

記事を読む

icatch-timezone

Android アプリでタイムゾーンを Asia/Tokyo で現在時刻を取得する

もしかしたら環境だったり、条件があるのかもしれないけど備忘録としてメモ。 Android アプ

記事を読む

icach-smartphone_10858946293_mini

Android アプリで “external/chromium/net/disk_cache/stat_hub.cc:216″ とエラーメッセージが表示された場合の対処法

Android アプリ開発中にとある画面を表示しようとしたら "external/chromium/

記事を読む

no image

AlertDialog の背景をタップできなくする

AlertDialog はモーダルダイアログではないので背景をタップできてしまう。それだとちょっと不

記事を読む

icatch-finished_6609228299_mini

Android アプリで特定の Activity が呼ばれたらアプリを終了させる方法

とある Activity が呼ばれたらアプリを終了させる方法です。 戻るボタンで戻りすぎることが出

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


四 + 4 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑