[Android 開発] GPS を使う

Posted by
ぴろり
Posted at
2015/02/05 19:47
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 多くの Android 端末に装備されている GPS を利用して、緯度・経度・標高などを取得するための覚書き。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

スクラップ帳 » Android アプリ開発 Tips ~ センサ入力

 Android アプリを開発する際の小技まとめ。GPS、コンパスなどの各種センサ デバイスからのデータの取得方法などの覚書きを網羅して、必要な機能をコピー&ペーストで再利用できるようにします。

  1. GPS を使う 2015/02/05 今ココ
  2. GPS 衛星の情報を取得する 2015/02/06
  3. GPS モジュールが出力する NMEA メッセージを取得する 2015/02/06
  4. 端末の傾きと方位角を求める (非推奨) 2015/02/07
  5. 端末の傾きと方位角を求める 2015/02/07

概要

 基本的な処理の流れは次の通りです。

  1. AndroidManifest.xml で、android.permission.ACCESS_FINE_LOCATION 権限を要求しておく
  2. LocationManager を取得する
  3. 位置情報が変化したら通知されるように、LocationManagerLocationListener を登録する
  4. 位置情報が変化したら(=位置情報を取得できたら)、先ほど登録した LocationListener のメンバ関数 onLocationChanged がコールバックされる
  5. 動作を止めるには LocationManager から LocationListener を外す


Pic.1 スクリーンショット

ソースコード

package com.example.helloworld;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.content.Context;
import android.location.LocationManager;
import android.location.LocationListener;
import android.location.Location;
import android.widget.TextView;

// http://developer.android.com/reference/android/app/Activity.html
public class MainActivity extends ActionBarActivity
{
    private LocationManager mLocationManager = null;
    private LocationListener mLocationListener = null;

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLocationManager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
        final boolean gpsEnabled = mLocationManager.isProviderEnabled( LocationManager.GPS_PROVIDER );
        if (!gpsEnabled) {
            // ToDo: GPS 有効にしてくれー
        }

        mLocationListener = new LocationListener()
        {
            // http://developer.android.com/reference/android/location/Location.html
            public void onLocationChanged(Location location) {
                String out =
                        "---------- Location --------\n" +
                        "緯度(Latitude)\n\t" + String.valueOf(location.getLatitude()) + " 度\n" +
                        "経度(Longitude)\n\t" + String.valueOf(location.getLongitude()) + " 度\n" +
                        "高度(Altitude)\n\t" + String.valueOf(location.getAltitude()) + " m\n" +
                        "精度(Accuracy)\n\t" + String.valueOf(location.getAccuracy()) + " m\n" +
                        "速度(Speed)\n\t" + String.valueOf(location.getSpeed()) + " m/s\n" +
                        "方角(Bearing)\n\t" + String.valueOf(location.getBearing()) + " 度\n" +
                        "時刻(Time)\n\t" + String.valueOf(location.getTime()) + " ミリ秒\n" +
                        "\n";
                Bundle extra = location.getExtras();
                if( extra != null ) {
                    int satellites = extra.getInt("satellites");
                    out += "extra.satellites\n\t" + String.valueOf(satellites);
                }
                
                TextView t = (TextView) findViewById( R.id.textView1 );
                t.setText( out );
            }

            public void onStatusChanged(String provider, int status, Bundle extras) {}
            public void onProviderEnabled(String provider) {}
            public void onProviderDisabled(String provider) {}
        };
    }

    protected void onStart() { // ⇔ onStop
        super.onStart();
        mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                1000 * 1/*mSec*/, 1/*meter*/,
                mLocationListener );
    }

    protected void onStop() { // ⇔ onStart
        super.onStop();
          mLocationManager.removeUpdates( mLocationListener );
    }
}

解説

22 行目
 LocationManager を取得します(概要の手順 2)。
23~26 行目
 もし、端末の位置情報サービスがオフになっていた場合、ユーザに処理を求めることができます。
28~55 行目
 LocationListener のインスタンスを生成しています(概要の手順 3)。ここでは匿名クラスとしてリスナを生成していますが、お行儀よく LocationListener を implements したサブクラスを定義すべきです。ここでリスナを生成していますが、まだ LocationManager に登録されていないので、位置情報は取得しません。
31 行目
 位置情報を取得できた際に呼ばれます(概要の手順 5)。位置情報から取得できる個々のパラメータは、Location オブジェクトを参照してください。緯度・経度・標高などの基本的な位置情報の他に、情報の精度や移動速度・移動方向なども取得できます。
42~46 行目
 追加の情報で、位置情報の取得に利用した GPS 衛星の数を取得できます。
48~49 行目
 location 変数の内容を整形して、アクティビティに配置した TextView に出力しています。
60 行目
 LocationManagerLocationListener を登録して、位置情報の取得を始めます(概要の手順 4)。ここで指定している距離と時間のパラメータは、情報を取得する頻度を決定するための参考値として利用されるので、実際にここで指定した数値で動作する訳ではないとのこと。
68 行目
 LocationManager から LocationListener を取り外して、位置情報の取得を停止します(概要の手順 5)。GPS による位置情報の取得は、バッテリを激しく消耗するので、こまめに止めてやる方が良いです。サンプル コードによっては、onStart/onStop ではなく、onResume/onPause で処理しているものもあります。

参考リンク

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:[Android 開発] GPS 衛星の情報を取得する

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。