SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Web APIで楽々Androidアプリ

Androidアプリでの位置情報取得と、複数のWeb APIアクセス

Web APIで楽々Androidアプリ(4)

  • X ポスト
  • このエントリーをはてなブックマークに追加

現在地点の緯度と経度を取得する

 前回、緯度と経度から都道府県を判別する処理を解説しました。処理の流れと説明が逆となってしまいましたが、今回は、現在位置の緯度と経度を取得する処理から解説していきます。

位置情報にアクセスするには

 現在地の緯度と経度を求めるには、多くのAndroid端末に備わっているGPSセンサーを利用します。また、GPSセンサーが搭載されていない機種でも、設定によって、WiFiなどのネットワークから位置情報を取得することもできます。

 位置情報にアクセスするには、まずマニフェストファイルの変更が必要です。AndroidManifest.xmlに、以下のように位置情報取得のパーミッションを追加しましょう。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

LocationManagerを取得する

 アプリから位置情報にアクセスするには、次のような手順です。

  1. LocationManagerを取得する。
  2. ロケーションプロバイダの選択基準を設定する。
  3. 位置情報リスナーを実装する。
  4. 位置情報の更新を要求する。

 Androidの位置情報は、LocationManagerというサービスで管理されていますので、まず、このLocationManagerのインスタンスを取得します(1)

ImaSoraActivity.javaの一部]
// ロケーションマネージャー
private LocationManager locationManager;

protected void onCreate(Bundle savedInstanceState) {

  // LocationManagerのインスタンスを取得する(1)
  locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
  if ( locationManager == null ) {
    return;
  }

  // メインの処理開始
  execStart();
}

// メイン処理
public void execStart() {

  // プロバイダの選択基準を設定する(2)
  Criteria criteria = new Criteria();
  criteria.setBearingRequired(false);  // 方位不要
  criteria.setSpeedRequired(false);    // 速度不要
  criteria.setAltitudeRequired(false); // 高度不要

  try {
    // 位置情報の更新を要求する(4)
    locationManager.requestSingleUpdate(criteria, 

      // 位置情報リスナー(3)
      new LocationListener(){
        @Override
        public void onLocationChanged(Location location) {

          // 住所を取得する
          getCurrentAddress(location);
        }
        @Override
        public void onProviderDisabled(String arg0) {}

        @Override
        public void onProviderEnabled(String arg0) {}

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
      },
      null
    );
  }
  catch (Exception e) {
    // 位置情報サービスが利用できない場合(5)
  }
}

ロケーションプロバイダの選択基準を設定する

 前述したように、位置情報を取得する手段(ロケーションプロバイダ)は複数ありますので、どのプロバイダを利用するのかを指定する必要があります。

 アプリから特定のロケーションプロバイダを指定することもできますが、通常は、どのようなプロバイダを選択するのかの条件だけを指定して、プロバイダの決定はAndroidに任せるようにします。

 条件の指定は、Criteriaというクラスを使います。Criteriaクラスでは、位置情報の精度や、必要な情報の指定が可能です。

 今回のアプリでは、単に緯度、経度のみを利用しますので、不要な情報を取得しないようにしています(2)。端末によっては、位置情報の取得に時間がかかる場合がありますので、少しでも早く終わるように必要な情報のみに絞っています。

位置情報リスナーを実装する

 位置情報のリスナーでは、LocationListenerというインターフェースを実装します(3)。LocationListenerインターフェースでは、4つのメソッドの実装が必要です。ただし今回は、位置情報の変化を受け取るonLocationChangedメソッドのみにコードを追加します。

 onLocationChangedメソッドのLocationパラメータには、測定した緯度、経度が含まれています。

位置情報の更新を要求する

 位置情報の更新を要求するには、LocationManagerに実装されているrequestLocationUpdatesメソッド、またはrequestSingleUpdateメソッドを実行します。

 requestLocationUpdatesの場合は、removeUpdatesというメソッドで更新を停止させない限り、位置情報を測定し続けます。今回のアプリでは、位置を追跡する必要もないでしょうから、位置情報を1回のみ取得するrequestSingleUpdateメソッドを使います(4)

 なお、requestSingleUpdateメソッドは、異なる引数のものが複数定義されています。サンプルのコードでは、Criteriaオブジェクト、リスナー、メッセージキュー(nullなら同じスレッドのキュー)を指定しています。

 Criteriaオブジェクトで、ロケーションプロバイダの選択基準のみを指定していますので、Android端末の状況によって適切なプロバイダが選択され、位置情報の更新を要求します。

 なお、位置情報にアクセスできない状況であれば、例外が発生します(5)

次のページ
複数のWeb APIにアクセスする

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Web APIで楽々Androidアプリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7399 2013/10/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング