AndroidでESLibraryを使ってLocationを取得する

こんにちは。tsmsogn です。

今回は、ESLibrary を使って位置情報を取得するサンプルを作ってみたいと思います。

SensorManagerをdependenciesに追加する

SensorManager は、SensorDataManeger を dependencies に追加します。

SensorManager は、各センサーを扱うラッパーライブラリで、SensorDataManager は SensorManager が返してくる JSON を、表示しやすいようにパースしたり、そのデータを保存するためのライブラリです。

SensorManager、および SensorDataManager は jcenter などで配布されていないようなので JitPack を使って compile するようにします。なお、JitPack でビルドできるようにパッチを当てたものを使用しています。

diff --git a/app/build.gradle b/app/build.gradle
index 4f958d5..9cb2002 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -26,5 +26,6 @@ dependencies {
     })
     compile 'com.android.support:appcompat-v7:25.3.1'
     compile 'com.android.support.constraint:constraint-layout:1.0.2'
+    compile 'com.github.tsmsogn:SensorManager:c0dac89'
     testCompile 'junit:junit:4.12'
 }
diff --git a/build.gradle b/build.gradle
index 1ea4bd0..345f00d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,6 +15,7 @@ buildscript {
 allprojects {
     repositories {
         jcenter()
+        maven { url 'https://jitpack.io' }
     }
 }
 

https://jitpack.io/#emotionsense/SensorManager/1708cd6

https://jitpack.io/#emotionsense/SensorManager/1708cd6

マニフェストパーミッション追加

$ git diff --cached app/src/main/AndroidManifest.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9b40b6a..1ec8ab1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -18,4 +18,8 @@
         </activity>
     </application>
 
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
+    <uses-feature android:name="android.hardware.location.gps" />
+
 </manifest>

PullLocationAsyncTaskを追加

    private class PullLocationAsyncTask extends AsyncTask<Void, Void, LocationData> {

        private static final String TAG = "PullLocationAsyncTask";
        private ESSensorManager sensorManager;

        PullLocationAsyncTask(Context context) {
            try {
                sensorManager = ESSensorManager.getSensorManager(context);
                sensorManager.setGlobalConfig(GlobalConfig.PRINT_LOG_D_MESSAGES, false);
            } catch (ESException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected LocationData doInBackground(Void... params) {
            LocationData data = null;
            try {
                Log.d(TAG, "Start sensing");
                data = (LocationData) sensorManager.getDataFromSensor(SensorUtils.SENSOR_TYPE_LOCATION);
                Log.d(TAG, "Sensed");
            } catch (ESException e) {
                e.printStackTrace();
            }

            return data;
        }
    }

LocationDataを表示

あとは、PullLocationAsyncTask#onPostExecute() などで、取得したデータを表示すれあば

        new PullLocationAsyncTask(this) {

            @Override
            protected void onPostExecute(LocationData locationData) {
                updateUI(locationData);
            }
        }.execute();

実際に、約5秒毎に1分間の位置情報が取得できていると思います。

まとめ

参考サイト