[Android] GPSログをテキストで保存、複数の Runtime Permissionの設定

Runtime Permissionを設定する必要があるものは、時として複数同時に必要であったりします。ここではGPSのログをExternal Storageに保存するケースで考えてみます。
 

Android Studio 2.3.2
Android 7.1.1

 


Multi Runtime Permission

 
GPSは ACCESS_FINE_LOCATION のパーミッションが必要です。また外部のストレージに書き込むときには WRITE_EXTERNAL_STORAGE も必要となります。この2つを順番に個別に確認しようとしてもうまくいきません。ユーザーの許可を得る場面で複数のパーミッションを確認できるようにします。
 
例えば、「1/2」で位置情報へのアクセス許可を尋ねます。
 

 
その後、「2/2」でメディアファイルへのアクセス許可を確認するダイアログが表示。
 

 
このような形でパーミッションの許可を取得するようにコードを記述していきます。
ここでどちらかを「許可しない」とすると、これ以降この場面では許可しなかったパーミッションだけを確認するようになります。
 

requestPermissions

 
複数のパーミッションを扱うには、配列、Arrayとして requestPermissions() をコールします。
 

 

 

onRequestPermissionsResult

 
onRequestPermissionsResult から結果を受け取りますが、permissions[]のインデックスに応じてgrantResults[]が、拒否ならば「-1」、許可すれば「0」が返ってきます。それぞれの結果を確認して、全て許可されない場合はユーザーに拒否された機能が使えないと明示して終わります。
 

 

まとめ

 
TestGPSServiceというプロジェクト名で作成したコード例です。
基本的には、GPS パーミッションを考慮して実装する で説明したパーミッションを複数の Runtime Permission に対応させて、バックグラウンドでGPS測位するように改変したものです。

 
AndroidManifest.xml

 

 
パーミッションの確認をします。
許可を確認できると「Start」ボタンで測位と書き込みを実行することができ、finish()で強制的にバックグラウンドに移行させます。測位の終了はフォアグランドで「Stop」ボタンを押すまで続きます。

MainActivity.java

 

 
GPS測位をサービスで実行させます。保存先は Environment.getExternalStorageDirectory().getPath() の直下です。また、MinTime と MinDistance の設定でログが増減します。
 

LocationService.java

 

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

activity_main.xml

 

 

 
関連ページ:

 

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