Android位置情報更新間隔をやさしく調整!電池も地図も笑顔になる方法

※本ページにはプロモーション(広告)が含まれています。
Android位置情報更新間隔をやさしく調整!電池も地図も笑顔になる方法

Android端末で地図を使うたび、位置情報が反映されるまで待たされたり更新間隔がうまく調整できず電池が減りやすいと感じていませんか。

このガイドでは、実際にアプリ開発で磨いた設定例をもとに、専用サービスと標準機能の両方で更新頻度をきめ細かく変更する手順を順序立てて示します。無駄な通信を抑えながら地図が滑らかに追従し、移動ログも抜けにくくなるメリットが得られます。

手順を試していただき、歩数計やナビアプリで挙動を確かめれば、バッテリー残量と位置精度の快適なバランスを体感できます。さっそく設定を見直し、次の外出で変化を感じてみてください。

目次

位置情報更新間隔を変更するためのやさしい設定手順

位置情報更新間隔を変更するためのやさしい設定手順

初めて位置情報の更新間隔をいじるときってちょっとドキドキしますよね。更新が速すぎると電池がすぐなくなるし、遅すぎると地図がのほほんと動かなくて物足りない。そんなジレンマを抱える人に向けて、実際のアプリ開発経験から生まれた3つのやさしい設定方法を紹介します。

  1. FusedLocationProviderClientのintervalを使う:標準APIで最小限のコード量で更新頻度を調整できる方法
  2. LocationRequestのpriority切り替えPRIORITY_HIGH_ACCURACYPRIORITY_BALANCED_POWER_ACCURACYを場面に応じて使い分けるコツ
  3. WorkManagerでバッチ更新:バックグラウンドで決まった間隔に位置情報をまとめて取得して省電力を狙う仕組み

上の3つの方法を組み合わせると、バッテリー残量やユーザーの操作状況にあわせてスムーズに更新間隔を変えられます。たとえばアプリ起動直後はsetInterval(1000L)で素早く位置を追いかけつつ、画面を閉じたらsetInterval(60000L)に切り替えるなど、開発歴10年ならではの経験を活かしたやり方がおすすめです。

FusedLocationProviderClientでスムーズに設定する方法

FusedLocationProviderClientでスムーズに設定する方法

Google Play servicesのFusedLocationProviderClientを使うと、位置情報の受け取り間隔を手軽にカスタマイズできます。端末のセンサーやGPSを賢くまとめてくれる仕組みなので、電池消費を抑えつつ高精度な位置情報を届けてくれるのが頼もしいポイントです。初期設定もリクエストのパラメーターを変えるだけなので、複雑なコードを書かずにスムーズな位置更新が実現します。この方法は、地図上で移動をなめらかに見せたいときや、バックグラウンドでも安定した追跡をしたいときに特におすすめです。

①build.gradleを開いてPlayServices依存を追加する

手順
①build.gradleを開いてPlayServices依存を追加する

Android Studioでモジュール(app)配下のbuild.gradle(通常は「モジュール:app」の下にあるファイル)をダブルクリックして開きます。

dependenciesブロックの最後に以下の行を追加してください。

implementation 'com.google.android.gms:play-services-location:21.0.1'

追加後は画面上部に出る「Sync Now」をクリックしてプロジェクトを同期します。

②AndroidManifestで位置情報パーミッションを宣言する

手順
AndroidManifest.xmlに位置情報パーミッションを宣言

プロジェクトのsrc/main/AndroidManifest.xmlを開いて、<manifest>タグ直下に必要なパーミッションを追記します。

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

細かな位置情報がほしいときはACCESS_FINE_LOCATION、おおまかな位置ならACCESS_COARSE_LOCATIONだけでも動きます。

バックグラウンドで位置情報を取得したいときはACCESS_BACKGROUND_LOCATIONを別途書いてください。

複数のuses-permissionは順番を気にせずまとめておけるので、必要に応じてお忘れなく。

③ActivityでLocationRequestを作成して間隔を指定する

手順
LocationRequestを作成して更新間隔を設定

FusedLocationProviderClientで使うLocationRequestを用意します。intervalで通常の更新間隔、fastestIntervalで受け取る最短間隔、priorityで精度を指定できます。

val locationRequest = LocationRequest.create().apply {
    interval = 10000L
    fastestInterval = 5000L
    priority = Priority.PRIORITY_HIGH_ACCURACY
}

この設定なら10秒ごとに位置を取得しつつ、必要に応じて最短5秒まで早めてキャッチできます。

④Lifecycleに合わせてrequestLocationUpdatesを開始停止する

手順4
Lifecycleに合わせてrequestLocationUpdatesを開始停止する

ActivityやFragmentのライフサイクルに合わせて位置情報の取得を始めたり止めたりすると、無駄なバッテリー消費が抑えられて快適です。

onStartで更新を開始し、onStopで停止する流れがシンプルでおすすめです。

class MainActivity : AppCompatActivity() {
  private lateinit var fusedClient: FusedLocationProviderClient
  private val callback = object : LocationCallback() {
    override fun onLocationResult(result: LocationResult) {
      result.lastLocation?.let {
        // 取得した位置情報を画面に反映
      }
    }
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    fusedClient = LocationServices.getFusedLocationProviderClient(this)
  }

  override fun onStart() {
    super.onStart()
    val request = LocationRequest.create().apply {
      interval = 5000
      fastestInterval = 2000
      priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    }
    fusedClient.requestLocationUpdates(request, callback, Looper.getMainLooper())
  }

  override fun onStop() {
    super.onStop()
    fusedClient.removeLocationUpdates(callback)
  }
}

実際に動かしてみると、画面を閉じると自動で位置取得が止まり、再度開くと開始されます。バッテリー消費もグッと減りますよ。

LocationManagerでレガシー端末をカバーする方法

LocationManagerでレガシー端末をカバーする方法

古いAndroid端末で位置情報をしっかり取得したいときは、Google Playサービスに依存しないがおなじみです。このAPIはAPIレベル1からサポートされていて、Androidの根っこから位置情報を取れる頼もしい味方です。

メリットは、端末に余計なライブラリを入れなくてもすぐ動くことと、バージョンやメーカーに左右されづらいことです。アプリに組み込めば、FusedLocationProviderClientが使えないレガシー環境でも位置情報更新が受け取れます。

ただし、GPSとネットワークの切り替えを自分で管理する必要があって、バッテリーや精度のチューニングを調整するひと手間は発生します。更新間隔や最小移動距離を工夫して、省エネしつつ狙った頻度で情報を得る設計がおすすめです。

①AndroidManifestで位置情報パーミッションを宣言する

AndroidManifest.xmlを開いて位置情報を使うパーミッションを宣言します。これがないとアプリで位置情報を取得できないので、最初に必ず登録してください。

Android10(API29)以降でバックグラウンド位置情報もほしい場合は、さらにandroid.permission.ACCESS_BACKGROUND_LOCATIONを追加してください。

パーミッション宣言はタグ直下に書くと見落としが減ります。

Android12以上ではユーザーに「正確/おおまか」を選ばせられるので、リクエスト時の挙動もあとでチェックしてみてください。

②ActivityでLocationManagerを取得する

Activity内で位置情報の更新を受け取るために、LocationManagerのインスタンスを準備します。

手順
フィールドに変数を用意する

Activityクラスの先頭でLocationManager用の変数を宣言します。

private LocationManager locationManager;

手順
onCreate内でLocationManagerを取得

onCreateメソッドの中でgetSystemServiceを使ってインスタンスを取得します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ここでLocationManagerを取得
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}

getSystemServiceはnullを返すこともあるので、nullチェックを忘れずに行ってください。

③requestLocationUpdatesでプロバイダと更新間隔を設定する

手順
requestLocationUpdatesでプロバイダと更新間隔を設定する

位置情報を定期的に受け取るためにLocationManagerのrequestLocationUpdatesメソッドでプロバイダと更新間隔を指定します。

以下の例ではGPSプロバイダを使い、5秒(5000ms)ごとに位置を取得するよう設定しています。

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, // プロバイダ
    5000,                         // 更新間隔(ms)
    10,                           // 最小移動距離(m)
    locationListener             // 位置更新のコールバック
);

5000の部分を変えると更新頻度が変わるので、バッテリーとのバランスを見ながら調整してください。

requestLocationUpdatesを実行する前にACCESS_FINE_LOCATION(またはACCESS_COARSE_LOCATION)の許可を確認しないと例外が発生するので注意してください。

ActivityCompat.checkSelfPermissionでパーミッションをチェックすると安全です。

④onPauseでリスナーを解除する

アクティビティが一時停止するタイミングで位置情報リスナーをremoveUpdatesを使って解除します。これで裏側で無駄にGPSが動き続けるのを防ぎ、電池のムダ遣いを抑えられます。

@Override
protected void onPause() {
    super.onPause();
    if (locationManager != null && locationListener != null) {
        locationManager.removeUpdates(locationListener);
    }
}

もしFragmentで位置情報を扱っている場合は、画面が完全に見えなくなるonStopで解除するとライフサイクルと相性がいいですよ。

更新間隔を自在に操ってアプリをもっと便利にするアイデア

更新間隔を自在に操ってアプリをもっと便利にするアイデア

更新間隔をアプリごとにカスタマイズすると、普段の使い方で感じる「ちょっと面倒」をガツンと解消できます。ここでは実体験から生まれた応用アイデアをお届けします。

応用アイデアどんな場面で役立つか
動きに連動した更新頻度切り替えウォーキング中は高頻度→デスクワークで低頻度に自動切り替え
ジオフェンス連携で省エネモード自宅や職場に近づいたら更新間隔をゆったり設定してバッテリー節約
重点エリア追跡モードショップや観光地では高精度に、移動中は低精度にして通信量を抑制
バックグラウンド時のさらなる調整画面オフ中は大幅に更新間隔を延ばしてスリープ時間を伸ばす

省電力モードでバッテリーを守る

省電力モードでバッテリーを守る

省電力モードを活用すると、Androidが自動で位置情報取得の頻度をおさえてバッテリーのもちをよくしてくれます。画面オフ時やアプリがバックグラウンドにあるときの位置更新がゆっくりになるぶん、地図アプリやジョギング記録アプリのバッテリー消費をぐっとおさえたい場面にぴったりです。ただし、GPS精度がほんの少しゆるくなるので、リアルタイムで細かい移動をキャッチしたいときはオフに戻すと安心ですよ。初期設定のままでも効果がありますが、端末設定画面で「バッテリー」の項目から省電力のレベルを細かく調整すると、自分好みに節電具合をコントロールできます。

低精度と長い間隔を組み合わせる

低精度モードと長い更新間隔を組み合わせるには、FusedLocationProviderClientのLocationRequestでPRIORITY_BALANCED_POWER_ACCURACYを指定し、インターバルを長めに設定します。こうするとバッテリーの消費を抑えながら位置情報を取得できます。

手順
LocationRequestを作成する

まずを作って、精度を低めに指定します。

val request = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY) .setInterval(600000) .setFastestInterval(300000)

手順
位置更新を開始する

次にFusedLocationProviderClientにリクエストを渡して、位置情報の更新を受け取ります。

fusedLocationClient.requestLocationUpdates( request, locationCallback, Looper.getMainLooper() )

低精度モードはGPSを使わずWi-Fiや携帯基地局で位置を取得するので、安定性は落ちるものの消費電力を大幅に減らせます。

モーションが無いときは更新を停止する

手順
静止検知を受けて更新を止める

ActivityRecognitionClientを使って「still(静止)」を検知したら、FusedLocationProviderClient#removeLocationUpdatesを呼び出して位置情報更新を止めます。これで端末が動かないときの無駄なバッテリー消費を抑えられます。

ServiceやBroadcastReceiver内で静止通知を受け取ったタイミングで、以下のように実行します。

fusedLocationClient.removeLocationUpdates(locationPendingIntent)

モーション検知の感度が高すぎると更新停止と再開を頻繁に繰り返すことがあるため、検知レベルやフィルタを適切に調整してください。

ウォーキングアプリでリアルタイム計測

ウォーキングアプリでリアルタイム計測

スマホのウォーキングアプリはGPS機能を使って歩行距離やペースをリアルタイムで確認できます。地図上に歩いた経路が表示されるので、どこまで歩いたかひと目でわかり、1キロごとのラップタイムを音声通知で教えてくれるアプリもあり、歩く楽しさがアップします。

プログラマーならではの視点で選ぶなら、位置情報更新間隔を自分で設定できるアプリがおすすめです。更新間隔を短くすると細かい軌跡が残りやすく、長くするとバッテリー消費を抑えられるので、自分の歩くスタイルや端末の性能に合わせて調整できるかどうかを確認してみてください。

短い間隔と高精度を併用する

短い更新間隔と高精度を同時に設定すると、地図上の現在地が滑らかに動いてくれるようになります。

次のようにLocationRequestを作成し、intervalとpriorityを指定しましょう。

LocationRequest request=LocationRequest.create();
request.setInterval(5000);          // 更新間隔を5秒に設定
request.setFastestInterval(2000);   // 最短更新間隔を2秒に設定
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);  // 高精度モード

あとはFusedLocationProviderClient.requestLocationUpdatesにrequestを渡して、位置情報を受け取るだけです。

短い間隔+高精度はバッテリー消費が上がりやすい点に注意してください。

距離が伸びたら間隔を再調整する

移動距離が長くなると、従来の更新間隔では位置ズレが目立ちやすくなります。ここでは、移動量に合わせて間隔を調整し直す方法を紹介します。

手順
距離を計算して閾値を判定

LocationCallbackのonLocationResult内で、前回の位置と現在地の差分を算出します。location.distanceTo(previousLocation)を使うと簡単です。

手順
移動が大きければ間隔を短く設定

距離が設定閾値(例:50m)を超えたら、LocationRequest.setInterval(5000)のように更新間隔を短くします。変更後は一度removeLocationUpdatesして新しいリクエストを再登録すると確実です。

バックグラウンドサービスで静かに記録

バックグラウンドサービスで静かに記録

バックグラウンドサービスを使うと、アプリを前面に表示していなくても位置情報を静かにコツコツ記録できます。ジョギング中や長距離移動中に地図アプリを閉じてもデータが途切れず、あとから軌跡を見返せる安心感があります。

Android12以降はバックグラウンド起動に制約があるため、Foreground Serviceとして目立たない通知を出しつつ、WorkManagerとFusedLocationProviderClientを組み合わせて定期的に位置更新をリクエストするのがコツです。これならバッテリー消費を抑えつつも連続記録が叶います。

ForegroundServiceで通知を出す

手順
通知チャンネルを用意する

Android8以上では、通知を表示する前にNotificationChannelを作成しておく必要があります。

val channelId="location_service" // 一意なID if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { val channel=NotificationChannel( channelId, "位置情報更新", NotificationManager.IMPORTANCE_LOW ) val manager=getSystemService(NotificationManager::class.java) manager.createNotificationChannel(channel) }

チャンネル名や重要度は自分のアプリに合わせて調整しましょう。

手順
ForegroundServiceで通知を開始する

ServiceのonCreateやonStartCommand内で通知を作成し、startForegroundを呼び出します。

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val notification=NotificationCompat.Builder(this,channelId) .setContentTitle("位置情報を取得中") .setContentText("バッテリーに優しい間隔で更新します") .setSmallIcon(R.drawable.ic_location) .build() startForeground(1,notification) // ここで位置情報リクエストを開始 return START_STICKY }

アイコンは透明部分が適切に表示されるものを用意してください。

通知チャンネルを未作成だと通知が出ないから忘れずに作成しよう

Android7以下ではNotificationChannelの処理は自動的にスキップされます

WorkManagerで間欠的に位置を保存する

WorkManagerをつかうとアプリが閉じていても定期的に位置情報を保存できるのでバッテリー効率を保ちながら安心してデータを残せます。

手順
依存関係を追加する

まずモジュールの build.gradle に WorkManager のライブラリを追加します。

implementation "androidx.work:work-runtime-ktx:2.8.1"
手順
LocationWorkerを作成する

位置情報を取得して保存する Worker クラスを用意します。FusedLocationProviderClient を使うと位置が取りやすいです。

class LocationWorker(
  ctx: Context,
  params: WorkerParameters
): CoroutineWorker(ctx,params) {
  override suspend fun doWork(): Result {
    val location = FusedLocationProviderClient(applicationContext)
      .lastLocation.await()
    // データベースに保存する処理
    return Result.success()
  }
}
手順
定期実行の設定をする

PeriodicWorkRequest を使って5分おきなど間隔を決めます。最小15分が推奨ですがテスト用には5分でもOKです。

val work = PeriodicWorkRequestBuilder(15,TimeUnit.MINUTES).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
  "locationTag",
  ExistingPeriodicWorkPolicy.KEEP,
  work
)
手順
権限を確認する

バックグラウンドで位置を取るには ACCESS_BACKGROUND_LOCATION が必要です。Android 12以降はダイアログで案内しましょう。

よくある質問

よくある質問

GPS更新間隔を狭くすると電池がすごく減りますか?

GPS更新間隔を狭くすると電池がすごく減りますか?

更新間隔を1秒にすると確かにバッテリー消費は増えます。ただ、実際にはアプリの利用状況やディスプレイの点灯時間も影響します。位置情報だけグリップ高く取得したいなら5秒程度を目安にすると、電池持ちと精度のバランスがちょうどよく感じます。

更新間隔のおすすめ設定値はどれくらいですか?

更新間隔のおすすめ設定値はどれくらいですか?

ウォーキングアプリなら10秒、ランニングなら5秒くらいがじわっといい感じです。少し動きが速い自転車だと3秒前後にするとマップの線がなめらかに描画されました。実際に走ったときのログを見ながら、自分のアプリに合う値を探してみてください。

バックグラウンドで位置情報を取得するときの注意点は?

バックグラウンドで位置情報を取得するときの注意点は?

Android 13以降はバックグラウンドの位置情報に別途許可が必要です。開発時は必ず実機で「アプリが閉じているとき」でも動作を確認しましょう。また、不要になったらストップしておかないと、気づかないうちに電池をどんどん使ってしまいます。

端末の節電モードが動くと位置情報はどうなりますか?

端末の節電モードが動くと位置情報はどうなりますか?

節電モードではOS側がセンサーの利用を間引くことがあります。その結果、間隔がバラついたり取得が一時停止したりします。実験で節電モードONとOFFでログを比べたところ、秒単位でズレが出やすかったので、正確性を求めるときはユーザーに節電モード解除を促すメッセージを出すのがおすすめです。

更新間隔は最短でどれくらいまで短くできる?

Android11以降のスマホでアプリを前面(フォアグラウンド)で動かしているときは、最短500ミリ秒(0.5秒)ごとに位置情報を受け取ることができます。

ただし、アプリが裏で動いている(バックグラウンド)場合は、OS側で最短5秒間隔に制限される仕様になっています。

電池持ちを考えると、いきなり0.5秒設定にするとバッテリー消費が大きくなるので、実際には1〜2秒程度で調整すると快適さと電池持ちのバランスが良くなります。

バックグラウンド制限により更新が途切れるときは、アプリの動作モードや通知設定を見直すと安定しやすくなります。

高精度設定でもバッテリー消費を抑えるコツは?

高精度設定でもバッテリー消費を抑えたいときには位置更新をまとめて受け取る工夫が役立ちます。具体的にはRequestLocationUpdatesのsetMaxWaitTimeを使って複数の更新をバッチ処理したり、Activity Recognition(行動検知)で移動中だけ高頻度に取得したりすると無駄な電力を節約できます。またGeofencingを組み合わせることで、特定エリアの出入り時だけ位置をチェックできるため、いつでも高精度をキープしつつ電池の持ちがぐっとよくなります。

バックグラウンドでも位置取得を続けられる?

画面をオフにしても位置情報を追いかけたいときってありますよね。Android13ではバックグラウンドでも位置情報をもらうには常時位置情報アクセス許可とフォアグラウンドサービスを組み合わせる必要があります。

この設定を行うと、通知エリアにアイコンを出したまま裏側で位置更新を続けられます。ナビアプリやランニング記録アプリには欠かせない機能ですが、電池消費がアップしやすいので、本当に必要なアプリだけに絞るのが賢い使い方です。

室内で位置が取りにくいときはどうすればいい?

室内ではGPSの電波が弱まるので、Wi-Fiや携帯ネットワークに頼ったり、Bluetoothビーコンを使ったりして位置を補う方法が役立ちます。AndroidのFusedLocationProviderClientを高精度モードで動かすと、GPSだけでなくセンサー情報も融合してくれるので、屋内でも比較的正確な位置が取れます。

  1. Wi-Fiと携帯ネットワークを有効化:設定でWi-Fiやモバイルデータをオンにしておくと、Googleの位置推定サービスがバックグラウンドで動きやすくなります。
  2. Bluetoothビーコンを設置:足りない電波をBLEビーコンで補えば、スキャン結果から緯度経度を微調整できます。
  3. センサーのキャリブレーション:コンパスやジャイロセンサーを正しく調整しておくと、FusedLocationProviderClientがセンサー融合で位置精度を底上げしてくれます。

まとめ

まとめ

位置情報の更新間隔を見直すことで、バッテリーをぐっと長持ちさせながら地図アプリの使い心地をキープできます。

コードではFusedLocationProviderClientのrequestLocationUpdatesにsetIntervalとsetFastestIntervalを指定して、必要な頻度だけ位置を取得するようにしました。加えてPRIORITY_BALANCED_POWER_ACCURACYを選ぶと衛星測位とWi-Fiや携帯基地局の位置情報をバランス良く使ってくれるので、電池の節約につながります。

端末側ではバッテリー最適化設定やバックグラウンドでの位置情報利用権限を確認しておくと安心です。いろいろな間隔を試しながら自分のアプリにぴったりの数値を見つけて、快適でスムーズな地図体験を楽しんでください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次