[Android] バックグラウンドでGPSログを取り続けるには

GPSのログを取り続けるためにはどうするといいのでしょうか。システムはすぐにスリープ、Dozeに入れてバッテリー消費を抑制しようとします。ただし、バックグラウンドなのですがいわゆるforegroundという形での記録ができます。

Android Studio 3.5
Android 10




GPSログ

 

(注)  こちらはAPI29までの実装になります。API 30からは権限リクエストのやり方がわかりました。ただ、このようなバックグラウンドで動作し続けるアプリはバッテリー消費のためGoogleはあまり推奨していないようです。foregoroundでバックグランドのように見せるにはシステムが止める事もあります。
ということで、これ以上はあまり注力するのを止めることとしました

GPSでログを取るためには現実的に裏にいないとできません。ネットサーチをしながらラインをやりながら裏でログを取るということです。ただ昨今のバックグラウンド制限が厳しくなってきたため、それを回避するためにはServiceとNotificationを使ってフォアグランドにいるようにすることで可能です。

https://akira-watson.com/android/service.html

この内容とGPS測位、外部ストレージでの保存を使っていきます。
 

 

startForegroundService

 
ActivityからstartForegroundService()でServiceを開始し、Service内で5秒以内に
startForegroundを呼び出します。これでステータスバーにはアイコンが表示されてForgroundにいるかのようになります。
 
Activity


 
Service


ここでアイコンは意外と重要で、これが無いと設定できません。理由はおそらく、ユーザーに対してアプリが起動中であることを明示するものだと思います。こっそりバックグラウンドで動き続けるゾンビアプリさせないような施策でしょうか。

 

サンプルコード

 
基本的には、GPS パーミッションを考慮して実装する で説明したようにGPSの設定をします。最初にPermissionが必要なので、ACCESS_FINE_LOCATIONとWRITE_EXTERNAL_STORAGEのpermissionを設定。またFOREGROUND_SERVICEのパーミッション設定が必要です。
 
AndroidManifest.xml


 
MainActivityではパーミッションの確認をします。
許可を確認できるとLocationServiceへ遷移します。今回はログの保存先を外部ストレージにしました。Runtime Permissionの確認が2つになります。

 
MainActivity.java


 
ここから位置測定のコードになります。
「Start」ボタンで測位と書き込みを実行することができ位置情報を取得すると外部ストレージに保存します。
「Log」ボタンで保存した履歴を表示させます。
「Reset」で履歴を消し、GPSも止めます。
 
LocationService.java


 
次に、外部ストレージへの書き込み、読み出しのクラスを作ります。
 
StorageReadWrite.java


 
レイアウトはこのようになります。呼び出した履歴はスクロールで表示させます。
 
activity_main.xml


 
リソースです
strings.xml


 
1x1.trans - [Android] バックグラウンドでGPSログを取り続けるには

このサンプルコードでできたアプリは、マルチタスク ウィンドウから消しても動き続けます。明確にストップさせない限り動き続けますので、実際バッテリーの減りが早くなりました。

 
関連ページ:

 
References:
LocationManager | Android Developers
Criteria | Android Developers
Runtime Permissions | Android Developers
Location Strategies | Android Developers
Location | Android Developers

シェアする

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

フォローする