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

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

Android Studio 3.4.1
API 29
AndroidX

 



LocationManager

 
GPSの実装はここのところ色々と制約がついてきてしまっているので、ここでの内容は以下の条件になります。それぞれ足りないところは関連ページで紹介しています。

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

また、Android 9.+ つまりAPI29でAndroidXなど微妙に変更点があります。
 

 

GPS簡単な実装

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

テストのみの簡易的な方法:
この実装無しでも可能です。(但し、テストのみ)
アプリをインストール起動後、「設定」「アプリと通知」から該当アプリにて
「権限」から「位置情報」をOnにすれば、面倒なpermissionのチェクコードが無くても動くことは動きます。
 
gps a04 - [Android] GPSで位置情報を取得するアプリを作る
 
gps a03 - [Android] GPSで位置情報を取得するアプリを作る

 
checkSelfPermission:
 
とりあえずpermissionのチェクが許可されない例外はあまり考えないで実装します。
実行時のパーミッション リクエストを参考に、
 

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

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

  • FineはGPSデバイスを使った精度が高い位置情報を取得します。
  • CoarseはGPSが使えない屋内やビルの谷間などでもネットワークを利用して大まかな情報を得ます。ただWiFi等を使うケースであれば、FusedLocationProviderApi を使った方がいいのでここではこの設定を使いません。
  • FineとCoarseは同じパーミッショングループなのでRuntime Permissionの許可は1つでいいようです。
 

LocationManager

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

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

 

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

provider:

  • GPSを使う場合は LocationManager.GPS_PROVIDER 設定します。
    ネットワークの場合は、LocationManager.NETWORK_PROVIDE となります。
    ただこの設定の場合はGPS_PROVIDERのみの選択で、ユーザーの位置情報設定が「バッテーリー節約」つまりNETWORK_PROVIDEになっていると設定を促すページに飛ぶようにしてあります。
    gps a05 - [Android] GPSで位置情報を取得するアプリを作る
    「高精度」あるいは「端末のみ」の選択です。
    また、Criteria を使って、低消費電力モードにすることもできます。Criteria

minTime:最小時間間隔[msec]、これは消費電力に大きく関係します

minDistance:最小距離間隔[m]、アップデートでの最小距離です

listener:登録したリスナー

 
onLocationChanged:

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

 

サンプルコード

 
まとめると
MainActivity.java

 
AndroidManifest.xml

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

 
emulatorで実行してみます。
最初はpermissionの確認ダイアログが出ますので許可します。
 
gps a06 - [Android] GPSで位置情報を取得するアプリを作る
 
emulatorの右下にあるMore「…」をクリックしてExtended controlsを開きます。
「Location」のタグから「latitude」「longitude」に数値を設定して「SEND」をクリックすると、アプリに緯度経度が表示されます。
 
gps 02 - [Android] GPSで位置情報を取得するアプリを作る
 
実機でテストもしてみましょう。
今回はGPSのみの動作ですので、屋外でテストするためにログをTextViewで出せるようにしました。屋外でも、ビルの谷間はほぼあきらめた方がいいです。衛星が見えても1個2個ですから最低3個、通常は4個補足する必要があります。
 
GPSの位置を取得するまで、数分かかる場合があります。GPS衛星のカレンダーを持っていれば、最初の補足時間が短くなりますが、無い場合は、衛星からその情報を取得するのです。

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

相対性理論「時間の遅れ」、日常世界で実証

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

 
References:

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加




アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう、時間の制約がないところが一番の魅力です。

以下の3つはAndroidが学習できるオンラインスクールです。


TECH ACADEMY
Androidアプリコース



侍エンジニア塾
侍エンジニア塾 無料体験レッスン



CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp





正直ネットや本では限界があります。直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。

尚、スクールがダメだと言う人がいますが、やる気があれば問題ありません。与えられるのを待っていてはいけないですね
欲しいものは取りに行くのです。


Google Pixel 3 XLグローバル版
SIMフリー 並行輸入品
6.3インチの大画面
背景をぼかすポートレートモード撮影


Anker PowerCore II Slim 10000
Power IQ 2.0搭載
iPhone & Android対応

シェアする

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

フォローする