[Android] GPSで位置情報を取得するアプリを作る

アンドロイドで位置情報を取得したい場合は、端末のGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvider が推奨されます。その中でも高い精度(数メール)が得られるのはGPSです。簡単にGPSを起動させて緯度経度を取得してみます。

Android Studio
2021.2.1

 




LocationManager

 
API 30 からの変更としては、バックグラウンドでの位置情報へのアクセス権を付与するには、ユーザーをシステム設定に移動して許可を得る必要があります。

GPSの実装は色々と制約がついているので、ここでの内容は以下の条件になります。

  • GPSを起動するための簡単な実装
  • 1つのRuntime Permissionのみを想定
  • フォアグランドのみでの実行

また、基本的にAndroid機はGPSだけでは位置情報を取得していないので FusedLocationProvider を実装することを最初から検討する選択肢もあります。ここは一応勉強のためです。
 

cat57 00 100x100 - [Android] GPSで位置情報を取得するアプリを作る
位置情報といえばGPSと思う人が多いとは思いますが、スマホでの位置情報はGPS以外にWiFiや電話網を駆使して短時間で効率の良い情報を取得で...

 
尚、Kotlinはこちら
 
gps 00 100x100 - [Android] GPSで位置情報を取得するアプリを作る
AndroidではGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvider が推奨されていますが、GPSが一...

 

 

GPS簡単な実装

 
GPSに必要なpermissionは、Android 6.0 Runtime Permissiondangerous permissionに該当するため、ユーザーが許可しないと使えません。これはコードが複雑になりますので、GPSとしての機能を確認するだけの簡単について考えてみます。

registerForActivityResult:
とりあえずpermissionのチェクが許可されない例外はあまり考えないで実装します。
(最終的には例外を考慮する必要があります)

onRequestPermissionsResultは非推奨になり

registerForActivityResult()を使います。
アクティビティの結果を取得する | Android デベロッパー

registerForActivityResult() は、

  • ActivityResultContract
  • ActivityResultCallback

を受け取り、他のアクティビティを開始するために使用する

  • ActivityResultLauncher

を返します。
 
permissionが既に許可されているかの確認


 
permissionチェックのリクエスト結果を受け取る


 
Permissionの設定:
 
Runtime Permissionが出てくる前はこれだけでしたが、AndroidManifestに以下の設定をします。FineとCoarseの2種類あります。Fineを設定する場合は両方必要

  • FineはGPSデバイスを使った精度が高い位置情報を取得します。
  • CoarseはGPSが使えない屋内やビルの谷間などでもネットワークを利用して大まかな情報を得ます。
 

LocationManager

 
LocationManagerのインスタンス生成:
GPSだけでなく位置情報を管理しているのがLocationMnagerです。そのインスタンスを生成します。


 
リスナーの登録:
Activityに LocationListener を登録します。

 

requestLocationUpdates:
 
LocationManagerからrequestLocationUpdatesを使って位置情報をアップデートするメソッドを呼び出します。


provider:

    • GPSを使う場合は LocationManager.GPS_PROVIDER 設定します。
      ネットワークの場合は、LocationManager.NETWORK_PROVIDE となります。
      ただこの設定の場合はGPS_PROVIDERのみの選択で、ユーザーの位置情報設定が「バッテーリー節約」つまりNETWORK_PROVIDEになっていると設定を促すページに飛ぶようにしてあります。
      1x1.trans - [Android] GPSで位置情報を取得するアプリを作る
       
      「高精度」あるいは「端末のみ」の選択です。
      また、Criteria を使って、低消費電力モードにすることもできます。Criteria
  • minTime:最小時間間隔[msec]、これは消費電力に大きく関係します
  • minDistance:最小距離間隔[m]、アップデートでの最小距離です
  • listener:登録したリスナー

 
onLocationChanged:

位置情報が変化したケースでonLocationChangedにてgetLatitude()getLongitude()を使って緯度経度を取得します。

 

サンプルコード

 
まとめると
MainActivity.java


 
AndroidManifest.xml


 

レイアウトですが、緯度・経度を表示するだけです。
activity_main.xml

 
emulatorで実行してみます。
最初はpermissionの確認ダイアログが出ますので「アプリの使用時のみ」あるいは「今回のみ」を許可します。
 
1x1.trans - [Android] GPSで位置情報を取得するアプリを作る


 
emulatorの右下にあるMore「…」をクリックしてExtended controlsを開きます。
「Location」のタグから地図上の位置を設定して「SET LOCATION」をクリックすると、アプリに緯度経度が反映されます。
 
1x1.trans - [Android] GPSで位置情報を取得するアプリを作る
 

Google Map と連携

 
GPSの位置情報を取得できても緯度経度だけではあまり意味がありません
地図で見たいわけです。Google Mapで見たいのですが

  • GoogleのAPIキーを取得してGoogle Map アプリを作成
    • Acitivityのテンプレートがあるのでアプリは難しくない
    • APIキーを作成するのは面倒で課金される可能性があるのでテストだけ
       
      x13.4 gmap 00 100x100 - [Android] GPSで位置情報を取得するアプリを作る
      Google Mapアプリを作る場合には、プロジェクトの新規作成でMAPアプリを選択すると簡単に出来上がります。

       
  • Intentを使ってGoogle Mapアプリを起動して地図上で位置を確認
    • APIキーはいらないIntentで飛ばすという安直なやり方
    • ユーザーが自分のアプリに戻ってこないかもしれない
       
      x13.4 gmap 00e 100x100 - [Android] GPSで位置情報を取得するアプリを作る
      API key 無しでIntentを使って簡単に Google Map を呼び出して地図を表示させる方法です。   GoogleMapを...

       

緯度経度を、geo:[緯度],[経度]?z=[ズーム] としてGoogleMapアプリに渡すとその位置の地図が表示されます


emulatorで皇居の位置情報をセットしてあるとこのようになりました。

1x1.trans - [Android] GPSで位置情報を取得するアプリを作る

実機テスト

実機でテストもしてみましょう。
今回はGPSのみの動作ですので、屋外でテストするためにログをTextViewで出せるようにしました。屋外でも、ビルの谷間はほぼあきらめた方がいいです。衛星が見えても1個2個ですから最低3個、通常は4個補足する必要があります。
 
GPSの位置を取得するまで、数分かかる場合があります。GPS衛星のカレンダーを持っていれば、最初の補足時間が短くなりますが、無い場合は、衛星からその情報を取得するのです。

GPSと相対性理論(余談)
ソフトウェア開発開発においてはあまり意識することはありませんが、GPSは日常生活でアインシュタインの相対性理論を実感できるものの一つです。
測位では距離計算を電波(光速:30万km/s)を使っていますが、1msecの違いは単純に300Kmになり東京から名古屋あたりまでの距離になります。たらたらアプリで計算なんかできませんね
相対性理論「時間の遅れ」、日常世界で実証

 

 
 
この内容は一番簡単なGPSの実装例です。実際には足りないところを考慮する必要があります。

関連記事:

 
References:

LocationManager | Android Developers
Criteria | Android Developers
直近の位置情報を取得する – Android Developers
現在地の更新情報をリクエストする – Android デベロッパー
位置情報の設定を変更する – Android デベロッパー
FusedLocationProviderClient
アプリの権限をリクエストする

シェアする

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

フォローする